仅去除带有通配符排除的二进制文件的函数名称

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。

【讨论】:

以上是关于仅去除带有通配符排除的二进制文件的函数名称的主要内容,如果未能解决你的问题,请参考以下文章

编译器会优化未使用的链接文件吗?

仅更新苹果故事中的应用程序名称,无需上传新的二进制文件

更新 iOS 应用程序:仅更新名称和关键字,没有二进制文件

linux中利用write函数来写是不是只能写文本文档,而不能写二进制文件?

laravel VerifyCsrfToken 排除带有通配符的url?

如何防止 C++ 名称解构函数包含在二进制文件中