12得票3回答
为什么链接器会修改一个--defsym“绝对地址”?

目标:使用一个来自不导出符号的可执行文件中的函数的共享库。 方法:gcc -Wl,--defsym,function=0x432238 该手册说明:"--defsym symbol=expression" Create a global symbol in the output file,...

14得票2回答
为什么不经常使用静态链接?

我明白动态链接的好处(旧代码可以自动利用库升级,它更节省空间),但它确实有缺点,特别是在异构的Linux生态系统中。这使得难以分发一个“只需运行”的与发行版无关的二进制文件,并且因为系统升级破坏了向后兼容性或将回归引入到共享库中,从而使先前工作的程序更容易出现故障。 考虑到这些劣势,为什么动...

43得票1回答
共享库中的nm符号输出中的t与T的含义是什么?

我在用户空间的fuse库中添加了一个新功能(fuse_lowlevel_notify_inval_directory)。编译和创建libfuse.so没有出现错误。但是当我的应用程序尝试使用这个新功能时,链接器会抛出错误:undefined reference to `fuse_lowleve...

8得票3回答
如何将我的Linux c++应用程序构建为链接到旧版本的libc?

我已经在Ubuntu 12.04上构建了一个应用程序,并尝试在嵌入式系统上运行它。我在我的开发机器上运行了apt-cache show libc6,其中显示了以下内容(以及其他内容): Package: libc6 Priority: required Section: libs Archi...

74得票5回答
LD链接器问题:--whole-archive选项

我所见到的唯一真正使用--whole-archive链接器选项的方法是从静态库创建共享库。最近,我遇到了一些使用这个选项来链接内部静态库的Makefile。当然,这会导致可执行文件不必要地引入未被引用的目标代码。我对此的反应是这是错误的,我有什么遗漏吗? 我有第二个问题与我读到的关于整个存档...

13得票1回答
rdynamic gcc选项的影响/缺点

我一直在从事一个大型的C++项目,它有近300 MB大小且超过800个文件。当二进制文件崩溃时,我想获得调用堆栈,并捕获了信号并将调用堆栈从backtrace_symbols写入文件中。但要从backtrace_symbols获取符号名称,我必须使用链接器标志'-rdynamic'进行编译。我...

27得票4回答
模板:使用前置声明可以减少编译时间吗?

我需要处理一个包含许多模板类的库,这些类都被实现在头文件中。目前我正在尝试找到一种方法来减少编译时间,因为我必须在每个编译单元中包含整个库,导致编译时间过长。 即使是对于模板,使用前向声明是否也是一种可能性呢?我试图按照下面的示例进行操作,通过避免像 #include <vector&...

8得票1回答
链接器如何在剥离符号的动态库中定位代码?

通常在动态库(Windows上的.dll,OSX上的.dylib和Linux/Solaris/BSD上的.so)中删除符号表是常见做法。这是有道理的,因为它可以大幅减小库文件的大小,通常超过75%。 然而,有一个问题一直困扰着我:一个被strip掉符号表的库并没有符号表。如果我编写一个引用该...

108得票5回答
Linux动态链接器中的“无版本信息可用”错误是什么意思?

我们的产品中包含一些动态链接到系统库(如“libpam”)的Linux二进制文件。在某些客户系统上,当程序运行时,我们会在标准错误输出中收到以下错误信息:./authpam: /lib/libpam.so.0: no version information available (require...

10得票2回答
解释性语言中的链接和加载

在编译语言中,编译器将源代码转换为目标代码,并将不同的目标文件(如果有多个文件)通过链接器进行连接。然后,加载器将连接后的文件加载到内存中以执行。 如果我使用解释性语言(例如ruby或python)编写一个应用程序并且源代码分布在多个文件中,那么这些文件何时被合并?换句话说,链接是何时完成的...