我正在使用GCC 3.4.0构建可执行文件。目标是嵌入式系统。我一直在使用一种模块化定义“控制台命令处理程序”的方法,通过在任何编译单元中定义一个处理程序的函数指针,使其位于某个链接器部分中。在运行时,在控制台上输入命令时,我可以循环遍历“控制台处理程序数据部分”中的所有处理程序,而无需具有对每个处理程序的引用的中央表。
聪明聪明的权利,现在它正在咬我。当我在没有其他外部引用符号的c文件中执行此操作时(例如,我的处理程序是唯一的函数),链接器会抛弃所有这些符号。我的处理程序不包含在最终的可执行文件中,也不包含在编译单元中。
有什么想法吗?
谢谢, 库尔特
答案 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),确实如此 你的回调对象文件包含在那里(也就是它 编译器或丢弃它的链接器?)