链接器抛出未定义的符号

时间:2010-03-09 22:02:50

标签: gcc linker symbols

我正在使用GCC 3.4.0构建可执行文件。目标是嵌入式系统。我一直在使用一种模块化定义“控制台命令处理程序”的方法,通过在任何编译单元中定义一个处理程序的函数指针,使其位于某个链接器部分中。在运行时,在控制台上输入命令时,我可以循环遍历“控制台处理程序数据部分”中的所有处理程序,而无需具有对每个处理程序的引用的中央表。

聪明聪明的权利,现在它正在咬我。当我在没有其他外部引用符号的c文件中执行此操作时(例如,我的处理程序是唯一的函数),链接器会抛弃所有这些符号。我的处理程序不包含在最终的可执行文件中,也不包含在编译单元中。

  • hack是在c文件中定义一个虚拟全局变量并在别处引用它,然后包含我的处理程序的特殊数据部分。
  • 我也可以使用-u到链接器并且它可以工作,但是打破了模块化的目标。
  • 我尝试在回调中使用属性((used))而没有运气 - 似乎被忽略了。
  • 我的特殊部分有KEEP规范,但这没有帮助。

有什么想法吗?

谢谢, 库尔特

2 个答案:

答案 0 :(得分:0)

除了编写一个链接器脚本之外,你还需要所有控件来决定包含/丢弃的内容等。尝试从你的所有目标文件中创建一个.a并指定-whole-archive到链接器,或者您需要找出所需的所有符号,并使用--retain-symbols-file

指定它们

答案 1 :(得分:0)

您应该能够使用显式链接描述文件执行此操作。 像

这样的东西
.mysection : {
       PROVIDE(_mysection = .);
       KEEP (callbacks.o(.text*))
}

将来自callbacks.o的.text部分放在.mysection中 输出文件。但是我希望编译器能够这样做 “used”属性,但链接器可能没有得到它。如果你看 在ld调用(例如使用-v标志到gcc),确实如此 你的回调对象文件包含在那里(也就是它 编译器或丢弃它的链接器?)