2016-12-25 8 views
0

간단한 "Hello, world"프로그램을 어셈블하고 TCC를 사용하여 링크했습니다. 그 후 4196 바이트의 실행 파일을 얻었습니다.최소한의 동적 연결 ELF 프로그램에는 어떤 섹션이 필요합니까?

프로그램의 섹션은 ['', '.text', '.data', '.bss', '.symtab', '.strtab', '.rel.text', '.rodata', '.rodata.cst4', '.note.GNU-stack', '.init', '.rel.init', '.gnu.linkonce.t.__x86.get_pc_thunk.bx', '.fini', '.rel.fini', '.text.unlikely', '.text.__x86.get_pc_thunk.bx', '.eh_frame', '.rel.eh_frame', '.preinit_array', '.init_array', '.fini_array', '.interp', '.dynsym', '.dynstr', '.hash', '.dynamic', '.got', '.plt', '.rel.got', '.shstrtab']입니다. 정말 단순한 바이너리를 위해 정말 많이 필요하다고 생각합니다. 프로그램을 실행하기 위해 실제로 필요한 것은 무엇입니까? 여기

는 소스 코드와 나는 그것을 컴파일 방법 :

 extern printf 
     global main 

     section .data 
msg: db "Hello World!", 0 

     section .text 
main: 
     ;; puts (msg) 
     push msg 
     call printf 
     add esp, 4 

     ;; return 0 
     mov eax, 0 
     ret 

NASM main.asm -f elf32 & & TCC main.o를 -o 주요

32bit/ubuntu:16.04 도커에서 테스트 영상.

참고 :이 질문은 tensible Linux ELF를 찾고 있지 않다는 점에서 this one과 다르지만 동적 기호를 호출 할 수있는 질문입니다. 나는 동적 링크의 본질 때문에 일부 여분의 섹션이 필요하다고 생각합니다.

+1

* objdump * (또는 유사)의 소스 코드와 출력을 표시하고 base64 인코딩 된 이진 파일은 표시하지 않습니다. CRT를 사용하고 있습니까? 기호를 디버그 하시겠습니까? –

+0

@MargaretBloom : 질문을 편집했습니다. – d33tah

+1

가능한 ELF 실행 파일에 필요한 섹션은 무엇입니까? (http://stackoverflow.com/questions/3832801/what-sections-are-required-for-a-usable-elf-executable) –

답변

1

동적 연결의 특성으로 인해 추가 섹션이 필요하다고 생각합니다.

귀하의 신념은 잘못된 것입니다. 아니요 섹션이 런타임에 필요하며 세그먼트에 해당됩니다.

실행 가능한 동적 연결 ELF 바이너리는 적어도 하나의 PT_LOAD 세그먼트, PT_INTERP 세그먼트 및 PT_DYNAMIC 세그먼트를 포함합니다.