如何使用shell脚本从相应的二进制对象文件中获取源C文件的完整路径

时间:2015-08-05 12:03:52

标签: shell gcc scripting binaryfiles

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

不理想,但如果使用调试开关进行编译,则可以从运行objdump -s -j.debug_info获取路径

路径将在输出中。

答案 2 :(得分:0)

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

作为贝壳单线:

$ 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/,$//'对于将每个源文件放在其自己的行上非常有用,而不用逗号。