有没有办法找到Linux中生成当前可执行文件的目标文件(RHEL是特定的)。我明白,可以使用“nm”来查找导出的符号,“ldd”来查找依赖的共享对象。Linux中可执行文件中的目标文件
但我无法找到命令来找出可执行文件所组成的对象(.o)文件的名称。可能吗?
有没有办法找到Linux中生成当前可执行文件的目标文件(RHEL是特定的)。我明白,可以使用“nm”来查找导出的符号,“ldd”来查找依赖的共享对象。Linux中可执行文件中的目标文件
但我无法找到命令来找出可执行文件所组成的对象(.o)文件的名称。可能吗?
如果已经使用调试信息编译了yes。使用gdb(man gdb)来查找信息。
如果它没有编译没有调试信息。你运气不好。
除了nullptr,“共享对象”是指其他共享库(链接),而不是原来的对象(不链接)
您还可以使用objdump
(只要可执行文件和对象进行编译调试信息):
# gcc -g -c -o /tmp/some_object.o /tmp/some_object.c
# gcc -g -o /tmp/file /tmp/file.c /tmp/some_object.o
# objdump -g /tmp/file | awk 'BEGIN{out=0} /Directory Table/{out=1} /Line Number Statements/{out=0} {if(out){print $0}}'
The Directory Table (offset 0x1b):
1 /tmp
The File Name Table (offset 0x21):
Entry Dir Time Size Name
1 1 0 0 file.c
The Directory Table (offset 0x5a):
1 /tmp
The File Name Table (offset 0x60):
Entry Dir Time Size Name
1 1 0 0 some_object.c
awk
是只是用来提取相关信息(如果你不使用,你会得到的可执行文件和对象)的全部调试信息。
目标文件的原始名称不存储在DWARF调试信息中。
每个目标文件在.debug_info
部分中都有一个DW_TAG_compile_unit
条目。此条目包含对“派生编译单元来源的主源文件 ”的引用,但不包含对象文件的名称。 The DWARF standard包含可以为每个编译单元存储的属性列表(第3.1.1节,页码44,pdf页58)。
可以查看存储有以下命令中的信息:
$ readelf --debug-dump=info --dwarf-depth=1 hw
输出:
Contents of the .debug_info section:
<some compilation units removed>
Compilation Unit @ offset 0x133:
Length: 0x8b (32-bit)
Version: 4
Abbrev Offset: 0x64
Pointer Size: 4
<0><13e>: Abbrev Number: 1 (DW_TAG_compile_unit)
<13f> DW_AT_producer : (indirect string, offset: 0x131): GNU C11 5.3.0 -mtune=generic -march=pentiumpro -g
<143> DW_AT_language : 12 (ANSI C99)
<144> DW_AT_name : (indirect string, offset: 0x163): hw.c
<148> DW_AT_comp_dir : (indirect string, offset: 0x168): /home/mikel/src/hw
<14c> DW_AT_low_pc : 0x80483db
<150> DW_AT_high_pc : 0x2e
<154> DW_AT_stmt_list : 0xea
<1><158>: ...
<some compilation units removed>
一个目标文件连接后转换为一个可执行文件。如果链接是共享的,那么你可以通过共享库(ldd
)获得。但是,如果链接是静态的,那么只有通过调试信息。您可以在RHEL(或Fedora)中安装debuginfo软件包。以下是说明
然后用这里描述GDB info sources
:
这将给你A L源文件。但要实际获取目标文件,您需要深入了解构建工具(rpmbuild
)。而实际运行的rpmbuild你需要源RPM软件包,您可以获取使用此处列出的说明:
现在可以构建软件包自己,并剖析其.o
文件导致进入可执行文件。
我希望有帮助。