programing

gcc는 리눅스 ELF에 어떤 기능을 추가합니까?

codeshow 2023. 9. 24. 13:10
반응형

gcc는 리눅스 ELF에 어떤 기능을 추가합니까?

c(또는 asm)에서 hello-world와 같은 프로그램을 링크할 때gcc결과 실행 가능한 객체 파일에 몇 가지를 추가할 것입니다.저는 런타임 다이나믹 링커에 대해서만 알고 있습니다._start진입점인데 이 추가된 기능의 종류는 무엇입니까?

00000000004003f0 t deregister_tm_clones
0000000000400430 t register_tm_clones
0000000000400470 t __do_global_dtors_aux
0000000000400490 t frame_dummy
00000000004004e0 T __libc_csu_init
0000000000400550 T __libc_csu_fini
0000000000400554 T _fini
0000000000600668 t __frame_dummy_init_array_entry
0000000000600668 t __init_array_start
0000000000600670 t __do_global_dtors_aux_fini_array_entry
0000000000600670 t __init_array_end

그들은 무엇이고 무엇을 위한 것입니까?어디엔가 묘사되어 있나요?구글링은 도움이 되지 않습니다.

이들 대부분은 "메인" 프로그램 그 자체 이전 또는 이후에 코드를 실행하는 다양한 방법이며 대부분은 에 거주합니다.crtstuff.c( https://github.com/gcc-mirror/gcc/blob/master/libgcc/crtstuff.c ).그들은 다양한 C 같은 프로그래밍 언어의 기능을 지원하기 위해 존재하지만, C로도 접근할 수 있습니다.이들 중 일부는 레거시 수하물을 나타내고 GCC가 실행하는 다양한 아키텍처를 지원하는 데 필요한 일부 변형을 나타내기 때문에 너무 복잡해 보입니다.

 

목록에서 하나씩(또는 둘씩):

00000000004003f0 t deregister_tm_clones
0000000000400430 t register_tm_clones

트랜잭션 메모리는 스레드를 사용한 프로그래밍을 단순화하기 위한 것입니다.잠금 기반 동기화의 대안입니다.이러한 루틴은 이러한 기능을 지원하는 라이브러리(libitm)에서 사용하는 테이블을 각각 분해 및 설정합니다.TM에 대한 자세한 정보는 여기 https://gcc.gnu.org/wiki/TransactionalMemory 및 여기 http://pmarlier.free.fr/gcc-tm-tut.html 에서 확인할 수 있습니다.

 

0000000000400470 t __do_global_dtors_aux

프로그램 종료 시 다음과 같은 시스템에서 모든 글로벌 디스트루터를 실행합니다..fini_array사용할 수 없습니다.

 

0000000000400490 t frame_dummy

이 기능은 에 있습니다..init부분.다음과 같이 정의됩니다.void frame_dummy ( void )그리고 인생의 핵심은 전화하는 것은__register_frame_info_bases논쟁거리가 있습니다.겉보기엔 함수에 대한 호출이 있고 인수가 있는 것으로 부터 인수를 사용합니다..init섹션은 신뢰할 수 없을 수 있으므로 이 함수는 그렇게 됩니다.__register_frame_info_bases직접 전화를 받지 않습니다..init section.그.eh_frame정보 베이스는 예외 처리 및 유사한 기능에 사용됩니다(예를 들어 다음과 같이 선언된 기능).__attribute__((cleanup(..)))).

 

00000000004004e0 T __libc_csu_init
0000000000400550 T __libc_csu_fini

이것들은 모든 프로그램 레벨의 초기화기와 최종화기(전체 프로그램의 생성자/파괴자와 같은)를 실행합니다.함수를 정의할 경우 다음과 같습니다.

void __attribute__ ((constructor)) mefirst () {
    /* ... do something here ... */
}

void __attribute__ ((destructor)) melast () {
    /* ... do something here ... */
}

그들은 앞뒤로 불려질 것입니다.main()이들 루틴에 따라 각각.https://gcc.gnu.org/onlinedocs/gccint/Initialization.html 도 참조

 

0000000000400554 T _fini

이것은 프로그램 레벨(객체 파일 레벨) 디스트럭터를 실행하는 지금은 사용하지 않는 방법입니다(이에 대한 약간의 정보는 에서 찾을 수 있습니다).man dlclose는 )입니다. 컨스트럭터에 해당하는 노후 함수는__init.

 

0000000000600668 t __frame_dummy_init_array_entry
0000000000600668 t __init_array_start

은 과 시작을 합니다..init_array섹션에는 모든 프로그램 수준 초기화에 대한 포인터가 포함되어 있습니다(위의 __libc_csu_init 참조).

 

0000000000600670 t __do_global_dtors_aux_fini_array_entry
0000000000600670 t __init_array_end

은 과 시작을 합니다..fini_array섹션에는 모든 프로그램 레벨 최종화기에 대한 포인터가 포함되어 있습니다(위의 __libc_csu_fini 참조).

 

[EDIT] 몇 가지 추가 참고 사항:

  • Jester의 질문 댓글에 있는 http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html (웨이백 머신) 링크에는 멋진 다이어그램과 이러한 작업이 실행되는 전체적인 순서와 C에서 이러한 기능 중 일부에 액세스하는 방법을 보여주는 작은 샘플 프로그램이 포함되어 있습니다.

  • 'ctor'와 'dtor'라는 용어는 각각 '건설자'와 '파괴자'의 줄임말입니다.

  • 글로벌 생성자/파괴자와 개체 파일 생성자/파괴자의 차이는 프로그램이 여러 개체 파일로 구성될 때 가장 분명하게 나타납니다.

  • 'T'로 표시된 기호(__libc_csu_init, __libc_csu_fini, _fini)는 "글로벌"(외부에서 볼 수 있음)이고 나머지 기호('t'로 표시됨)는 그렇지 않습니다.

언급URL : https://stackoverflow.com/questions/34966097/what-functions-does-gcc-add-to-the-linux-elf

반응형