用 Clang 编译时如何将编译参数存进 ELF 的某个 section 里?

2020-09-04 00:59:06 +08:00
 dangyuluo

最近遇到一个问题,就是需要从编译好的 ELF 里提取出编译时的参数,比如 Wall,Werror 一类的。GCC 下很容易,有一个 section 叫.GCC.command.line。但是 Clang 编译出的 ELF 里没有类似的 section 。

请问哪位有点思路?我应该怎么去找。谢谢

2757 次点击
所在节点   LLVM
4 条回复
secondwtq
2020-09-04 01:14:40 +08:00
我还不知道有这个功能 ...
查了一下发现 GCC 有个 flag 叫 -frecord-gcc-switches,不写好像是不会有这个 section 的。楼主该不会是哪个发行版默认打开了吧
然后 Clang 一般是和 GCC 兼容的,直接找对应的 flag 就行了
https://reviews.llvm.org/rL299037
https://reviews.llvm.org/D54487
dangyuluo
2020-09-04 02:33:12 +08:00
@secondwtq 哈是的,我是打开了-frecord-gcc-switches 。原来 Clang 的对应 flag 叫-grecord-gcc-switches,就一个字母区别😓😓

明天再搞
ivan_wl
2020-09-04 10:39:34 +08:00
1. 把编译参数写入一个文本文件
2. 生成一个.S 汇编,定义全局符号,用.incbin 包含刚才的文本文件,结尾再加个.byte 0,这样就定义了一个字符串
3. 带着这个.S 一起编译就行了,c 代码中可以用.S 定义的全局符号访问这个字符串了
secondwtq
2020-09-04 19:45:53 +08:00
-g 是调试信息 flag, -grecord-gcc-switches 是把参数存进调试信息,不是 .GCC.command.line 。GCC 也有 -grecord-gcc-switches 。
我说是兼容的就是名字是一样的。当然实现可能会塞点私货。
你要是没有 -frecord-gcc-switches 那估计是版本老了点。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/704047

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX