저는 C 프로그램을 통해 작업하고 있었고 Linux/UNIX 개발이 처음이어서 주변을 둘러보고 있었습니다.
저는 Hello world의 간단한 C 프로그램을 만들고 컴파일 과정을 검사하고 있었습니다.
최종 실행 파일의 파일 헤더를 읽으려고 시도했고 다음과 같은 출력을 얻었습니다.
$ objdump -f my_output
file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048320**
elf32-i386 부분은 이해하지만 헤더의 다른 부분은 잘 모르겠습니다.
D_PAGED
수요 페이징과 어떻게 든 관련이 있습니까 ? 그리고은 무슨
EXEC_P, HAS_SYSMS
뜻인가요? 시작 주소는 main()
프로그램의 논리 주소입니까 ?
답변1
출력의 플래그는 다음과 같습니다.BFD - 바이너리 파일 설명자. 그것들은 binutils 패키지의 일부입니다. bfd 헤더 파일에서 /usr/include/bfd.h
그 의미를 살펴보면 플래그의 의미를 읽을 수 있습니다 .여기.
"플래그"에 대한 참조0x00000112이라고 불리는 것입니다플래그 필드. 이는 바이너리이며 각 비트는 특정 기능을 나타냅니다. 1은 플래그가 켜져 있거나 설정되어 있음을 의미하고 0은 그렇지 않음을 의미합니다. 또한 "0x..."는 16진수 값을 의미하므로 HEX에서 BIN으로 변환하면 다음과 같습니다.
0x00000112 = 0001 0001 0010 이진수입니다.
따라서 플래그 필드의 2번째, 5번째, 9번째 비트에 해당하는 플래그가 설정됩니다. 이는 명령 출력의 세 번째 줄에 이름으로 표시되는 플래그입니다 objdump
.
플래그의 의미
실행 파일에 있는 3가지 플래그는 꽤 표준적입니다. 오른쪽에서 왼쪽으로 비트를 읽어보세요!
첫 번째 비트 - 0000 0000 0010
/* BFD is directly executable. */
#define EXEC_P 0x02
두 번째 비트 - 0000 0001 0000
/* BFD has symbols. */
#define HAS_SYMS 0x10
세 번째 비트 - 0001 0000 0000
/* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the
linker sets this by default, but clears it for -r or -n or -N). */
#define D_PAGED 0x100
그래서 요점은 다음과 같습니다.
- 이것은 실행 파일입니다
- Gnu Debugger를 사용하여 디버깅하려는 경우 기호 테이블을 포함하므로
gdb
함수는 의미 있는 이름을 갖게 됩니다. - 실행 파일은 glibc 등과 같은 표준 라이브러리에 동적으로 연결됩니다.
시작 주소
마지막 줄인 시작 주소 ...는 짐작한 대로 실행 파일에 대한 실제 .CODE가 시작되는 위치입니다.