仅去除带有通配符排除的二进制文件的函数名称
Posted
技术标签:
【中文标题】仅去除带有通配符排除的二进制文件的函数名称【英文标题】: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:这不起作用,因为默认情况下会导出所有函数
【参考方案1】:
如果我使用 --s --wildcard --keep-symbol="blabla_*" --keep-symbol="blabla" ...它仍然会剥离太多并破坏兼容性。
您可能会感到困惑:由于您的二进制文件是一个共享库,它不需要任何 常规符号表中的符号(nm foo.so
显示的那个)——它 只有需要动态符号表(由nm -D foo.so
显示),而strip
不会(不能)从动态符号表中删除任何符号。
因此,从共享库中删除所有符号是一种常见的做法,这不会破坏兼容性。
它对你的图书馆有用,你并没有讲述整个故事。
附:要控制准确在动态符号表中导出哪些符号(因此保留在strip --strip-all
之后),请使用链接器版本脚本。详情请见this answer。
【讨论】:
以上是关于仅去除带有通配符排除的二进制文件的函数名称的主要内容,如果未能解决你的问题,请参考以下文章
linux中利用write函数来写是不是只能写文本文档,而不能写二进制文件?