2011-03-16 138 views
0

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

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

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

gcc正在删除版本字符串,因为没有任何内容引用该字符串,并且我们已打开-Os优化。

有没有办法确保gcc不去掉一串字符串(我们需要嵌入大约5-10个版本字符串)?

谢谢。

回答

2

好,解决这一点,我们在交流的文件这样做:

const char _string_[] = "some string"; 

然后包括对象文件在最后一个链接:

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

尝试用--retain符号文件(选项链接)

ldmangpage工作:

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

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

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

编辑我刚刚注意到上面引用的文档的最后一行。它将覆盖“脱光所有”选项,所以我不知道这会帮助你...

+0

嗨,不幸的是,它似乎没有按照通缉。如前所述,现在保留所有其他不需要的符号。因为这不是一个主要的问题,因为它将19k添加到最终的二进制文件中。 – user626201 2011-03-17 06:51:09