저는 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가지 플래그는 꽤 표준적입니다. 오른쪽에서 왼쪽으로 비트를 읽어보세요!
번호 1 - 0000 0000 0010
/* BFD is directly executable. */
#define EXEC_P 0x02
위치 2 - 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 디버거를 사용하여 디버깅하려는 경우
gdb
함수에 의미 있는 이름을 갖도록 기호 테이블이 포함되어 있습니다. - 실행 파일은 glibc 등과 같은 표준 라이브러리에 동적으로 연결됩니다.
초기 주소
마지막 줄인 시작 주소...는 짐작할 수 있듯이 실행 파일의 실제 .CODE가 시작되는 위치입니다.