链接抛出未定义的符号

问题描述:

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

聪明机灵的权利,以及现在它咬我。当我在没有其他外部引用符号的c文件中执行此操作时(例如,我的处理程序是唯一的函数),链接程序将其全部抛出。我的处理程序不包含在最终的可执行文件中,编译单元中也没有其他任何东西。

  • 黑客是在c文件中定义一个虚拟的全局变量,并在别处引用它,然后我的处理程序在它的特殊数据部分,包括在内。
  • 我还可以用-u到链接器和它的作品,但吹模块化的目标。
  • 我使用我的回调属性((使用)),没有运气尝试 - 似乎被忽略。
  • 我的特殊部分有KEEP规范,但这样做没有帮助。

任何想法?

感谢, 库尔特

除了写一个链接脚本,在你拥有所有你永远需要决定什么被列入控制/ discared等尝试建立以.a你的所有目标文件的并指定-whole-archive的连接,或者需要与--retain-symbols-file

+0

感谢您的回复。不幸的是,我相信所有这些选项都需要明确命名每个函数指针,以便将它保存在二进制文件中。这就损害了模块化的链接器部分的目的,否则我只会制作一个*表格并完成它。 我真的需要一些方法来告诉它永远不会扔掉链接到某个部分的符号。 –

找出所有你想要的符号,并且指定其中你应该能够明确的链接脚本来做到这一点。 喜欢的东西

.mysection : { 
     PROVIDE(_mysection = .); 
     KEEP (callbacks.o(.text*)) 
} 

会把.text段从callbacks.o第.mysection在 输出文件。不过,我希望编译器用 这个“used”属性来做到这一点,但也许链接器不会得到它。如果您在LD调用看起来 (如与-v标志GCC),并 回调目标文件得到包括有(即是它的 编译或丢弃的连接)?