【问题标题】:Undefining linker symbols in gcc在 gcc 中取消定义链接器符号
【发布时间】:2011-03-16 13:00:31
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

    标签: gcc linker makefile versioning


    【解决方案1】:

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

    const char _string_[] = "some string";
    

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

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

    【讨论】:

      【解决方案2】:

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

      来自ldmangpage

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

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

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

      EDIT 我刚刚注意到上面引用的文档的最后一行。它将覆盖“全部删除”选项,所以我不确定这会对您有所帮助...

      【讨论】:

      • 嗨,不幸的是,它似乎没有按预期工作。如前所述,它现在也保留了所有其他不需要的符号。因为这并不是一个真正的主要问题,因为它在最终的二进制文件中增加了 19k。
      猜你喜欢
      • 2017-06-14
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      相关资源
      最近更新 更多