V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dangyuluo
V2EX  ›  LLVM

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

  •  
  •   dangyuluo · 2020-09-04 00:59:06 +08:00 · 2889 次点击
    这是一个创建于 1539 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    明天再搞
    ivan_wl
        3
    ivan_wl  
       2020-09-04 10:39:34 +08:00
    1. 把编译参数写入一个文本文件
    2. 生成一个.S 汇编,定义全局符号,用.incbin 包含刚才的文本文件,结尾再加个.byte 0,这样就定义了一个字符串
    3. 带着这个.S 一起编译就行了,c 代码中可以用.S 定义的全局符号访问这个字符串了
    secondwtq
        4
    secondwtq  
       2020-09-04 19:45:53 +08:00
    -g 是调试信息 flag, -grecord-gcc-switches 是把参数存进调试信息,不是 .GCC.command.line 。GCC 也有 -grecord-gcc-switches 。
    我说是兼容的就是名字是一样的。当然实现可能会塞点私货。
    你要是没有 -frecord-gcc-switches 那估计是版本老了点。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3485 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 11:09 · PVG 19:09 · LAX 03:09 · JFK 06:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.