문제

컴파일러를 처음부터 완전히 작성하려는 노력의 일환으로 현재 ELF 파일을 처리하는 부분을 작업하고 있습니다.

이에 대한 여러 기사와 사양을 훑어본 후에도 섹션과 세그먼트 매핑이 어디에 저장되어 있는지 여전히 잘 이해하지 못합니다.NASM+ld에 의해 생성된 작은 실행 파일을 관찰할 때 .text 섹션이 어떻게든 LOAD 유형 프로그램 헤더에 매핑되어 있음을 알 수 있습니다. 그런데 어떻게 그럴까요?

작은(작동하는) 실행 파일을 입력으로 제공할 때 readelf 출력의 작은 부분:

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x0000000000000084 0x0000000000000084  R E    200000

 Section to Segment mapping:
  Segment Sections...
   00     .text 

작동하는 실행 파일을 가지려면 이 매핑이 필요합니까?아니면 완전히 생략해도 여전히 유효한 실행 파일을 가질 수 있습니까?

도움이 되었습니까?

해결책

아직도 분할 매핑 섹션이 저장되는 위치를 아직도 이해하지 못합니다.

그들은 이 아니다 어디서나 저장되지 않습니다.

오히려 readelf는 파일 오프셋 및 섹션 및 세그먼트의 크기를보고 맵핑을 계산합니다.

다른 팁

@Employed Russian에 따라 테스트를 수행했습니다.

readelf -l ./libandroid_servers.so

Elf file type is DYN (Shared object file)
Entry point 0x0
There are 6 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x00000034 0x00000034 0x000c0 0x000c0 R   0x4
  LOAD           0x000000 0x00000000 0x00000000 0x0f830 0x0f830 R E 0x1000
  LOAD           0x010000 0x00010000 0x00010000 0x00cf4 0x011ac RW  0x1000
  DYNAMIC        0x010540 0x00010540 0x00010540 0x00130 0x00130 RW  0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0
  EXIDX          0x00f2e8 0x0000f2e8 0x0000f2e8 0x00548 0x00548 R   0x4

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .hash .dynsym .dynstr .rel.plt .rel.dyn .plt .text .rodata .ARM.extab .ARM.exidx 
   02     .init_array .fini_array .data.rel.ro .dynamic .got .data .bss 
   03     .dynamic 
   04     
   05     .ARM.exidx 

01 LOAD 오프셋: 0x000000 파일 크기 0x0f830
.ARM.exidx 섹션 끝 주소: hex(0x00f2e8 + 0x00548) = 0xf830

02 로드 오프셋:0x010000 파일 크기:0x00cf4
.init_array 섹션 시작 주소: 10000h
.bss 섹션 끝 주소: hex(0x00f2e8 + 0 ) = 0x10cf4

당신은 readelf 반드시 계산을 통해 세그먼트의 섹션을 인쇄하십시오.잘 어울려요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top