我们有一个在嵌入式oOS上运行的程序。我们通常在输出二进制文件中嵌入一个版本字符串,它可以识别生成二进制文件时包含的所有版本。通常,我们使用的编译器可以通过创建一个“未定义的”符号来确保版本字符串在二进制文件中,然后由我们的版本字符串进行解析。
但是,我们现在已经转移到基于Linux的系统和gcc。
gcc正在从最终的可执行文件中删除版本字符串。最终的exe是通过链接在一堆库中创建的。每个库都嵌入了一个版本字符串。
gcc正在删除版本字符串,因为没有任何内容引用该字符串,而我们已经打开了-Os优化。
有没有办法确保gcc不会剥离字符串的集合(我们需要嵌入大约5-10个版本的字符串)?
谢谢。
发布于 2011-03-17 16:35:22
好的,为了解决这个问题,我们在一个c文件中这样做:
const char _string_[] = "some string";然后在最终链接中包含目标文件:
gcc <snip> -Wl,--start-group string.o <snip> -Wl,--end-group -Wl,--strip-all -o final.exe发布于 2011-03-16 21:08:11
尝试使用--retain-symbols-file (链接器的选项)
从ld mangpage
-- Retain - symbols -file filename仅保留文件文件名中列出的符号,丢弃所有其他符号。filename只是一个平面文件,每行只有一个符号名称。此选项在逐渐累积大型全局符号表的环境(如VxWorks)中特别有用,可节省运行时内存。
--retain- symbols -file不会丢弃未定义的符号或重定位所需的符号。
您只能在命令行中指定--retain-symbols-file一次。它覆盖了-S和-s。
我刚刚注意到上面引用的文档的最后一行。它会覆盖“全部剥离”选项,所以我不确定这是否会对你有帮助...
https://stackoverflow.com/questions/5325624
复制相似问题