기존 실행 파일이 있지만 소량의 소스 코드가 누락되었습니다. 특히 실행 파일은 정적 라이브러리의 일부 기능을 사용하며 해당 라이브러리의 소스 코드는 손실됩니다. 이전 버전의 라이브러리 코드가 있지만 실행 파일은 이전 버전에 없는 3~4가지 메서드를 사용합니다. 누락된 함수에 대한 프로토타입을 포함하는 새 버전의 코드에 대한 헤더 파일이 있지만 .c
실제 함수 정의가 포함된 파일은 없습니다.
실행 파일이 정적으로 링크되어 있으므로 정적 라이브러리에서 개체 코드를 추출하여 다시 빌드할 수 있는 방법이 있는지 알고 싶습니다. 을 사용 nm
하여 필요한 기호를 찾을 수 있지만 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