2009-04-30 47 views
8

有没有办法找到Linux中生成当前可执行文件的目标文件(RHEL是特定的)。我明白,可以使用“nm”来查找导出的符号,“ldd”来查找依赖的共享对象。Linux中可执行文件中的目标文件

但我无法找到命令来找出可执行文件所组成的对象(.o)文件的名称。可能吗?

回答

6

如果已经使用调试信息编译了yes。使用gdb(man gdb)来查找信息。

如果它没有编译没有调试信息。你运气不好。

1

除了nullptr,“共享对象”是指其他共享库(链接),而不是原来的对象(不链接)

1

您还可以使用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是只是用来提取相关信息(如果你不使用,你会得到的可执行文件和对象)的全部调试信息。

4

目标文件的原始名称不存储在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> 
1

一个目标文件连接后转换为一个可执行文件。如果链接是共享的,那么你可以通过共享库(ldd)获得。但是,如果链接是静态的,那么只有通过调试信息。您可以在RHEL(或Fedora)中安装debuginfo软件包。以下是说明

然后用这里描述GDB info sources

这将给你A L源文件。但要实际获取目标文件,您需要深入了解构建工具(rpmbuild)。而实际运行的rpmbuild你需要源RPM软件包,您可以获取使用此处列出的说明:

现在可以构建软件包自己,并剖析其.o文件导致进入可执行文件。

我希望有帮助。

相关问题