如何链接从未在C中引用的函数

时间:2015-03-27 01:54:01

标签: c linker

链接器的默认行为是排除从未引用的所有函数。但是我想包含这样一个函数用于调试目的:当程序运行异常时,我可以手动将PC设置为该函数的地址并输出一些信息。

有办法吗?

2 个答案:

答案 0 :(得分:1)

  

链接器的默认行为是排除从未引用的所有函数。

对于我熟悉的所有链接器,该语句都是错误的:如果显式列出在链接行上定义了foo()的目标文件,那么foo()始终包含在链接的可执行文件或共享库中(除非您在链接行上指定--function-sections -Wl,--gc-sections)。

如果在目标文件中定义了foo(),并且该目标文件位于 archive 库中,并且该目标文件没有对任何符号的任何引用,那么确实如此定义,然后该对象文件不会被拉入链接。

然后解决方案是

  • 在链接行上明确列出foo.o,或
  • 使用-Wl,--whole-archive -lfoo -Wl,--no-whole-archive(或链接器的等效标志,如果有的话)或
  • 添加-u foo以强制foo.o被拉入链接。

答案 1 :(得分:0)

首先创建包含该函数的该c文件的目标文件。

gcc <Yourfile_Name>.c -o functions.o

并使用ld创建可执行文件。我不知道如何使用Microsoft Visual Studio Compiler执行此操作。