실행 파일에서 정적 라이브러리 복원

실행 파일에서 정적 라이브러리 복원

기존 실행 파일이 있지만 소량의 소스 코드가 누락되었습니다. 특히 실행 파일은 정적 라이브러리의 일부 기능을 사용하며 해당 라이브러리의 소스 코드는 손실됩니다. 이전 버전의 라이브러리 코드가 있지만 실행 파일은 이전 버전에 없는 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

관련 정보