我在Windows 7下的Cygwin中使用gcc 4.3.4和ld 2.20.51.这是我的问题的简化版本:
foo.o包含在bar.o foo_bar()中调用的函数bar()bar.o 包含功能 bar()main.c调用函数foo.o,但foo_bar()不在调用链中如果我尝试编译main.c并将其链接到foo.o,我会undefined reference to _foo_bar从ld 收到错误.正如您在Makefile中看到的,除了下面的内容之外,我已经尝试使用标志将每个函数放在它自己的部分中,并让链接器丢弃未使用的部分.
COMPILE_CYGWIN = gcc -iquote$(INCDIR)
COMPILE = $(COMPILE_CYGWIN) -g -MMD -MP -Wall -ffunction-sections -Wl,-gc-sections $(DEFINE)
main_OBJECTS = main.o foo.o
main.exe : $(main_OBJECTS)
$(COMPILE) -o main.exe $(main_OBJECTS)
Run Code Online (Sandbox Code Playgroud)
该功能foo_bar()是一个简短的功能,提供协议栈中两个网络层之间的连接.某些程序不需要它,因此它们不会链接到与堆栈上层相关的其他目标文件中.这是一个小功能,似乎不适合将它放入自己的.o文件中.
我不明白为什么ld抛出错误 - 什么都没有调用foo_bar(),所以没有必要包含bar()在最终的可执行文件中.一位同事刚刚告诉我,这ld不是一个"智能连接器",所以也许我想做的事情是不可能的?
除非链接器来自Cyberdyne Systems,否则它无法确切地知道实际调用哪些函数.它只知道引用了哪些.即使是天网的链接器也无法预测将在运行时动态加载模块并开始调用各种全局函数1时将做出什么样的运行时决策.
因此,如果您在模块m中链接并且它引用函数f,则需要链接任何具有f的模块.
| 归档时间: |
|
| 查看次数: |
2086 次 |
| 最近记录: |