dlopen()
공유 객체가있을 때 명시 적으로 호출하지 않고 DLL을 실행하는 코드가있는 메커니즘이 있습니까? 특히, 호출자가 dlopen()
인 globals/statics에 대한 C++ 정적 초기화 코드는 알 수 없습니까? 나는 대답이 "예"여야한다고 확신하지만, 어떤 메커니즘이 일어 났는지, 그리고 임의의 코드를 실행하기 위해 그것을 활용하는 방법을 기억하지 못한다.dlopening 할 때 정적 초기화 (및/또는 기타) 코드가 실행됩니까?
3
A
답변
2
예 : dlopen
은 로딩 할 때 코드를 실행하기위한 ELF 이진 형식 메커니즘을 따릅니다.
- 더 오래된 사람이 전화를
dlopen
및dlclose
에 대한 함수 포인터의 배열을 포함하는 특수.init
및.fini
의 섹션을 사용실제로이 같은 메커니즘이 있습니다. 런타임에 섹션이 나타나지 않을 수도 있기 때문에 해당 섹션을 가리키는
DT_INIT
및DT_FINI
동적 태그가 있습니다. - 더 새로운 메커니즘
.init_array
및.fini_array
및DT_INIT_ARRAY
,DT_INIT_ARRAYSZ
,DT_FINI_ARRAY
및DT_FINI_ARRAYSZ
동적 태그에 대응한다.
두 메커니즘의 차이점은 here입니다.
__attribute__((constructor))
으로 C 함수를 꾸미면 컴파일러는 객체가 dlopen
일 때 실행되도록 두 가지 메커니즘 중 하나를 사용합니다. 동적 초기화가 필요한 전역 C++ 객체의 구성 코드에도 동일하게 적용됩니다.
http://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work – Brian
@ 브라이언 : 당신이 대답 할 수있을 것 같아요 ...하지만 사용하지 않으면 어떻게 될까요? GCC? 예 : clang 또는 ICC? – einpoklum