如何 link 一个从未在 C 中引用的函数

How to link a function which is never referenced in C

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

有办法吗?

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

gcc <Yourfile_Name>.c -o functions.o

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

The linker's default behavior is to exclude all functions which is never referenced.

对于我熟悉的所有 link 人来说,该陈述都是错误的:如果您 明确地 列出其中定义了 foo() 的对象文件link 行,那么 foo() 总是 包含在被 linked 的可执行文件或共享库中(嗯,除非你指定 --function-sections -Wl,--gc-sections 在 link 行)。

的确如此,如果 foo() 在一个目标文件中定义,并且该目标文件在 archive 库中,并且该目标文件不满足任何对它定义的任何符号的引用来自 link、 然后 中已经使用的其他文件,该目标文件将不会被拉入 link.

解决方案是

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