【问题标题】:Stripping only function names of a binary with wildcard exclusion仅去除带有通配符排除的二进制文件的函数名称
【发布时间】:2020-08-09 20:59:47
【问题描述】:

我想以保留某些函数名称的方式剥离我的二进制文件,因为二进制文件是一个共享库,并且所有其他函数名称都从符号表中剥离。

使用-g 开关删除所有调试信息,这很好,但不包括函数名称。

如果我使用--s --wildcard --keep-symbol="blabla_*" --keep-symbol="*blabla*" ...,它仍然会剥离太多并破坏兼容性。

有没有办法从符号表中删除函数名?我考虑用ELF parser 重写ELF 中的函数名称,但这比应有的更乏味,因为它似乎是一个足够常见的用例,可以由strip 命令或其他“标准化”命令支持.

【问题讨论】:

  • 你试过--strip-unneeded吗?
  • @kaylum:这不起作用,因为默认情况下会导出所有函数

标签: c++ linux gcc elf strip


【解决方案1】:

如果我使用 --s --wildcard --keep-symbol="blabla_*" --keep-symbol="blabla" ...它仍然会剥离太多并破坏兼容性。

您可能会感到困惑:由于您的二进制文件是一个共享库,它不需要任何 常规符号表中的符号(nm foo.so 显示的那个)——它 只有需要动态符号表(由nm -D foo.so显示),而strip不会(不能)从动态符号表中删除任何符号。

因此,从共享库中删除所有符号是一种常见的做法,这不会破坏兼容性。

它对你的图书馆有用,你并没有讲述整个故事。

附:要控制准确在动态符号表中导出哪些符号(因此保留在strip --strip-all 之后),请使用链接器版本脚本。详情请见this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-19
    • 2019-06-08
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    相关资源
    最近更新 更多