在gcc中取消定义链接器符号

时间:2011-03-16 13:00:32

标签: gcc linker makefile versioning

我们有一个在嵌入式oOS上运行的程序。我们通常在输出二进制文件中嵌入一个版本字符串,可以识别生成二进制文件时包含的所有版本。通常我们使用的编译器可以通过创建一个“未定义”符号来确保版本字符串在二进制文件中,然后由我们的版本字符串解析。

但是,我们现在已经转向基于Linux的系统和gcc。

gcc正在从最终的exe中删除版本字符串。最终的exe是通过链接在一堆库中创建的。每个库都嵌入了一个版本字符串。

gcc正在删除版本字符串,因为没有任何内容引用字符串,我们已经启用了-Os优化。

有没有办法确保gcc不会删除字符串集合(我们需要嵌入大约5-10个版本字符串)?

感谢。

2 个答案:

答案 0 :(得分:2)

好的,为了解决这个问题,我们在c文件中做到了这一点:

const char _string_[] = "some string";

然后在最终链接中包含目标文件:

gcc <snip> -Wl,--start-group string.o <snip> -Wl,--end-group -Wl,--strip-all -o final.exe

答案 1 :(得分:1)

尝试使用--retain-symbols-file(链接器选项)

来自ld mangpage

  

- retain-symbols-file filename       仅保留文件filename中列出的符号,丢弃所有其他符号。 filename只是一个平面文件,每行一个符号名称。此选项在逐渐累积大型全局符号表的环境(例如VxWorks)中特别有用,以节省运行时内存。

     

- retain-symbols-file不会丢弃未定义的符号或重定位所需的符号。

     

您只能在命令行中指定--retain-symbols-file一次。它会覆盖-s和-S。

编辑我刚刚注意到上面引用的文档的最后一行。它将覆盖'strip all'选项,所以我不确定这会对你有帮助......