链接器的默认行为是排除所有从未引用的函数。不过我想包含这样一个函数用于调试目的:当程序运行异常时,我可以手动将PC设置为该函数的地址并给出一些信息输出。
有办法吗?
最佳答案
The linker's default behavior is to exclude all functions which is never referenced.
对于我熟悉的所有链接器来说,该声明都是错误的:如果您显式列出在链接行上定义 foo()
的目标文件,则 foo()
总是包含在链接的可执行文件或共享库中(当然,除非您指定 --function-sections -Wl,--gc-sections
在链接行上)。
确实,如果 foo()
是在目标文件中定义的,并且该目标文件位于归档库中,并且该目标文件不满足任何引用它定义的来自链接中已使用的其他文件的任何符号,那么该目标文件将不会被拉入链接。
解决方案是:
- 在链接行上明确列出
foo.o
,或者 - 使用
-Wl,--whole-archive -lfoo -Wl,--no-whole-archive
(或链接器的等效标志,如果有的话),或者 - 添加
-u foo
以强制将foo.o
拉入链接。
关于c - 如何链接一个在C中从未被引用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29292031/