2014-04-15 1 views
2

그래서 테스트 플랫폼은 Linux 32 비트입니다. 링커가 .rodata 섹션의 특정 데이터 주소를 결정하는 방법은 무엇입니까?

은 내가 이런 식으로 퀵의 OBJ 파일을 생성하는 GCC를 사용

의 gcc -S quickSort.c

및 생성 된 quickSort.o는 재배치 ELF입니다 :

퀵 #file quickSort.o .o 인 :

을 제거하지 ELF 32 비트 LSB 재배치, 인텔 80386, 버전 1 (SYSV), 나는 다음을 분해 objdump를 사용

생성 된 ASM 파일로보고
objdump -d quickSort.o 

및 691,363,210, 나는이 함께 혼란 스러워요 :

51: b8 00 00 00 00   mov $0x0,%eax 
56: 89 04 24    mov %eax,(%esp) 
59: e8 fc ff ff ff   call 5a <main+0x5a> 
5e: c7 44 24 3c 00 00 00 movl $0x0,0x3c(%esp) 

위의 코드는 호출 printf 함수이며, 문자열을 인쇄, 나는 quicksort.s에 quicksort.c를 컴파일하는 경우 그것은이를 좋아한다 "

movl $.LC0, %eax 
    movl %eax, (%esp) 
    call printf 

을 따라서 재배치 테이블을보고, 나는 쉽게"5A "의 관계와의 printf를 찾을 수 있고, 확실 링커의 printf와 대체 위치를 변경하려면이 방법을 사용할 수 있습니다입니다 fc ff ff ff "를 printf의 실제 주소로,

하지만 .LC0 (.rodata 섹션의 문자열) 주소를 어떻게 재배치 할 것인지 혼란 스럽습니다. 나는 관계 테이블에서 단서를 찾을 수 없습니다 (I는 quickSort.o -r readelf를 사용하여 재배치 테이블을 가지고)

사람이 나에게 링커가 일부 데이터의 실제 메모리 주소를 찾는 방법에 대한 몇 가지 도움을 줄 수 .rodata 섹션?

답변

1

동일한 방식으로 이루어집니다. .rodata에 대한 재배치 항목이 표시되어야합니다. 여기서 .rodata은 현재 오브젝트 파일에있는 .rodata 부분의 시작 주소를 의미합니다.

objdump -dr은 작업을위한 더 나은 도구 일 수 있습니다.

+0

예, 감사합니다. 나는 지금 어디서 문제인지 알고 있다고 생각한다. – computereasy

관련 문제