심볼 테이블에서 시스템 호출의 값은 0입니다.

심볼 테이블에서 시스템 호출의 값은 0입니다.

바이너리 파일의 기호 테이블을 보려면 다음 명령을 사용합니다.

readelf -s mybinary

아래에서 출력의 일부를 볼 수 있습니다. 여기에 이미지 설명을 입력하세요.

보시다시피, 모든 시스템 호출(예: printf 및 종료)의 값은 00000000입니다. 그런데 이 시스템 호출의 주소를 찾고 싶습니다. 어떻게 해야 합니까? 많이 검색했지만 아무것도 찾지 못했습니다.

답변1

printf및 함수가 포함된 라이브러리는 프로그램 시작 후 동적으로 로드되는 exit공유 라이브러리( )입니다 . *.so이러한 함수의 주소는 동적 링커가 라이브러리를 프로세스의 주소 공간에 배치할 때까지 알 수 없습니다. 프로그램이 실행될 때마다 주소가 변경될 수 있습니다.

gdb디버거를 사용하면 중단점까지 프로그램을 실행하고 p printf디버거 프롬프트에 입력하여 동적 링커가 함수를 배치한 위치를 찾을 수 있습니다.

동적 연결을 방지하려면 라이브러리를 프로그램에 정적으로 연결하면 됩니다. 이렇게 하면 주소가 미리 알려져 있으며 를 이용하여 확인할 수 있다 readelf. 정적 컴파일러를 사용하려면 gcc명령 -static줄에 옵션을 추가하세요. 예:

gcc -static myprog.c -o myprog

관련 정보