두 개의 파일을 사용하면 하나는 컴파일되고 링크되고 gcc
다른 하나는 수동으로 사용 됩니다 nasm
.ld
- ELF 32비트 LSB 공유 객체...
- ELF 32비트 LSB 실행 파일...
이 두 가지의 차이점은 무엇입니까? 내가 볼 수 있는 readelf -h
건
- 유형:
DYN (Shared object file)
- 유형:
EXEC (Executable file)
다음에서 이 기록을 볼 수 있습니다.ET_DYN
다음을 위한 WikipediaET_EXEC
. 둘 사이의 실질적인 차이점은 무엇입니까?
답변1
이는 위치 독립적 실행 파일(PIE)과 관련된 것으로 보입니다. GCC는 기본적으로 실행 파일을 컴파일할 때 PIE로 만들고 ELF 헤더의 출력 플래그를 ET_DYN
.
다음을 사용하여 PIE 실행 파일 생성을 비활성화할 수 있습니다.
gcc -no-pie
이 내용이 표시되면 gcc 구성의 기본 옵션을 확인하면 gcc -v
다음과 같은 내용이 표시됩니다 --enable-default-pie
.
다음에서 영감을 받은 답변StackOverflow의 이 제출을 통해.여기서는 좀 더 활용해서 더 설명하겠습니다.
답변2
Linux 커널/동적 로더에서 ET_EXEC 및 ET_DYN의 주요 역할은 ASLR을 사용하여 실행 파일이 임의의 메모리 위치에 배치될 수 있는지 여부를 알리는 것 같습니다.
결론적으로 PIE 실행 파일은 공유 라이브러리처럼 무작위로 지정될 수 있기 때문에 DYN입니다.
나는 이것을 더 자세히 조사했고 다음과 같습니다.
- 관련 Linux 커널 5.0 코드에 대한 포인터:Linux 바이너리가 위치 독립적 코드로 컴파일되었는지 테스트하는 방법은 무엇입니까?
- PIE ASLR을 직접 관찰하는 방법을 보여줍니다.https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031#51308031