그래서 테스트 플랫폼은 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 섹션?
예, 감사합니다. 나는 지금 어디서 문제인지 알고 있다고 생각한다. – computereasy