我有一个现有的可执行文件,但丢失了少量源代码。特别是,可执行文件使用静态库中的一些函数,并且该库的源代码丢失。我确实有该库代码的旧版本,但可执行文件使用旧版本中没有的三到四种方法。我有一个新版本代码的头文件,其中包括缺少的函数的原型,但.c
缺少包含实际函数定义的文件。
由于可执行文件是静态链接的,我想知道是否有一种方法可以通过从中提取目标代码来重建静态库。我可以使用nm
and找到我需要的符号objdump
,但我不知道是否有办法提取这些函数并将它们重新打包到目标文件或静态库中。
例如,它看起来像这样:
$ nm ./theApplication
<a bunch of stuff>
001721dc T _missingFunction1
<more stuff>
00171ed8 T _missingFunction2
<more stuff>
$ objdump --disassemble-all ./theApplication
<a bunch of stuff>
00171ed8 <_missingFunction2>:
171ed8: 1a e5 f8 14 P2 = [P3 + 0x53e0];
<more stuff>
001721dc <_missingFunction1>:
1721dc: c5 04 [--SP] = (P5:5);
<more stuff>
我想将missingFunction1()
其missingFunction2()
拉出到静态库或目标文件中,以便我可以在其他可执行文件中链接它们。这可能吗?如果可以,该怎么做?
答案1
如果您正在检查的可执行文件是在启用 DEBUG 的情况下构建的,您将发现大量详细说明用于编译的源文件和头文件的信息,包括这些文件源自的目录位置、原始编译命令(包括所有参数)、大量信息、使用只有objdump
很少的选择...
编译信息
objdump -Ws --dwarf=info --dwarf-depth=1 <EXE_FILE>
这个命令生成 DWARF 格式的输出,不用担心这意味着什么,只需DW_TAG_compile_unit
在输出中搜索标签,您会发现很多像这样的实例,揭示源文件、编译命令,以及许多对您的调查有用的信息。
<526a1>: Abbrev Number: 1 (DW_TAG_compile_unit)
<526a2> DW_AT_name : calculate_tax_rate.c
<526ad> DW_AT_language : 12 (ANSI C99)
<526ae> DW_AT_comp_dir : /opt/src/modules/calc/
<526d2> Unknown AT value: 2205: /opt/gnu/bin/cc -V -m64 -I/opt/hdr/include -L/opt/sqlserver/lib -L/opt/DBG/bin/utils -xc99=all -m64 -c -o MESG_UTIL.o MESG_UTIL.c
<52813> Unknown AT value: 2207: Xa;R=HPUX C 3.11 HPUXOS 2004/06/02;
目录表信息
objdump -Wl --dwarf=info --dwarf-depth=1 <EXE_FILE>
该命令详细说明源文件和头文件的目录表信息;The Directory Table
在输出中搜索标签:
The Directory Table:
/opt/src/modules/calc/
/usr/include
The File Name Table:
Entry Dir Time Size Name
1 1 0 0 calc.c
2 1 0 0 debug.h
3 2 0 0 calc_math.h
4 2 0 0 calc_math.c
将源代码行#与汇编指令混合
此命令反汇编 .text(代码)部分,并将源代码行号与相应的汇编指令相关联。这真的很麻烦,但是你可以通过对每个源文件的每一行进行逆向工程,从技术上重新创建原始源行为。是的,这是一个有趣的项目:-)。希望能帮助到你
objdump -Ddlw --section=.text <EXE_FILE>
/home/projects/src/modules/calc/calc.c:476
1000364f0: e0 5f a7 af ldx [ %fp + 0x7af ], %l0
1000364f4: e0 77 a7 df stx %l0, [ %fp + 0x7df ]
/home/projects/src/modules/calc/calc.c:477
1000364f8: e0 5f a7 b7 ldx [ %fp + 0x7b7 ], %l0
1000364fc: e0 77 a7 d7 stx %l0, [ %fp + 0x7d7 ]
/home/projects/src/modules/findrates.c:4434
100036500: e8 5f a7 df ldx [ %fp + 0x7df ], %l4
100036504: e2 5f a7 c7 ldx [ %fp + 0x7c7 ], %l1
100036508: e0 57 a7 eb ldsh [ %fp + 0x7eb ], %l0
10003650c: a7 2c 30 03 sllx %l0, 3, %l3
100036510: e8 74 40 13 stx %l4, [ %l1 + %l3 ]
/home/projects/src/modules/calc_encrypt.c:480
100036514: e8 5f a7 d7 ldx [ %fp + 0x7d7 ], %l4
100036518: e2 5f a7 c7 ldx [ %fp + 0x7c7 ], %l1