답변1
printf
및 함수가 포함된 라이브러리는 프로그램 시작 후 동적으로 로드되는 exit
공유 라이브러리( )입니다 . *.so
이러한 함수의 주소는 동적 링커가 라이브러리를 프로세스의 주소 공간에 배치할 때까지 알 수 없습니다. 프로그램이 실행될 때마다 주소가 변경될 수 있습니다.
gdb
디버거를 사용하면 중단점까지 프로그램을 실행하고 p printf
디버거 프롬프트에 입력하여 동적 링커가 함수를 배치한 위치를 찾을 수 있습니다.
동적 연결을 방지하려면 라이브러리를 프로그램에 정적으로 연결하면 됩니다. 이렇게 하면 주소가 미리 알려져 있으며 를 이용하여 확인할 수 있다 readelf
. 정적 컴파일러를 사용하려면 gcc
명령 -static
줄에 옵션을 추가하세요. 예:
gcc -static myprog.c -o myprog