【问题标题】:How to get the complete path of source C file from its corresponsing binary object file using shell script如何使用 shell 脚本从对应的二进制目标文件中获取源 C 文件的完整路径
【发布时间】:2017-02-09 03:39:07
【问题描述】:

我有目标文件 uart.o 我正在尝试从二进制文件中获取源文件的完整路径。我正在使用 GCC RENESAS 和 COSMIC 编译器。 我正在使用命令 - 字符串 -a -f uart.o | grep "uart.c" 从字符串命令中获取包含路径的行。我得到随机数据和线条。我可以通过 shell 以任何其他方式从目标文件中获取源文件的完整路径吗?

【问题讨论】:

    标签: shell gcc scripting binaryfiles


    【解决方案1】:

    如果您的对象/库/二进制文件已使用调试符号(-g 选项到gcc)构建,则此信息将包含在调试信息中。您可以使用 gdb info sources 命令获取此列表。

    作为shell单线:

    $ gdb -q -ex "set height 0" -ex "info sources" -ex quit my_obj_file.o
    Reading symbols from my_obj_file.o...done.
    Source files for which symbols have been read in:
    
    /home/ubuntu/my_c_file.c
    
    Source files for which symbols will be read in on demand:
    
    
    $ 
    

    这个目标文件之前是这样构建的:

    $ gcc -g -c my_c_file.c -o my_obj_file.o
    $
    

    输出列表可能是逗号和换行符分隔的,因此您可能需要一些sedawk 后处理来将其转换为每行一个条目的纯列表。将输出通过管道传送到 sed 's/ \+$//;s/, /\n/g;s/,$//' 对于将每个源文件放在单独的行上(不带逗号)很有用。

    【讨论】:

      【解决方案2】:

      目标文件通常不会对相应源文件的完整路径进行编码。这样做会产生安全隐患,因为它会将本地文件系统布局的详细信息暴露给任何有权访问二进制文件的人。

      无论如何,编译器本身通常只在相对路径上运行,并且不知道也不关心完整的文件系统路径。

      【讨论】:

      • 我有对文件的完整路径进行编码的编译器。完整或相对我需要以某种方式提取这些路径。我该怎么做?
      • 也许您可以更新您的问题以包含有关您正在使用的编译器的详细信息?这可能有助于我们得出更准确的答案。
      • GCC RENESAS COSMIC 编译器
      【解决方案3】:

      不理想,但如果你使用调试开关编译,你可以通过运行 objdump -s -j.debug_info 获得路径

      路径将在输出中。

      【讨论】:

        猜你喜欢
        • 2016-07-06
        • 2020-01-30
        • 1970-01-01
        • 2014-02-09
        • 2010-10-15
        • 2015-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多