3

dlopen() 공유 객체가있을 때 명시 적으로 호출하지 않고 DLL을 실행하는 코드가있는 메커니즘이 있습니까? 특히, 호출자가 dlopen() 인 globals/statics에 대한 C++ 정적 초기화 코드는 알 수 없습니까? 나는 대답이 "예"여야한다고 확신하지만, 어떤 메커니즘이 일어 났는지, 그리고 임의의 코드를 실행하기 위해 그것을 활용하는 방법을 기억하지 못한다.dlopening 할 때 정적 초기화 (및/또는 기타) 코드가 실행됩니까?

+1

http://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work – Brian

+0

@ 브라이언 : 당신이 대답 할 수있을 것 같아요 ...하지만 사용하지 않으면 어떻게 될까요? GCC? 예 : clang 또는 ICC? – einpoklum

답변

2

예 : dlopen은 로딩 할 때 코드를 실행하기위한 ELF 이진 형식 메커니즘을 따릅니다.

  • 더 오래된 사람이 전화를 dlopendlclose에 대한 함수 포인터의 배열을 포함하는 특수 .init.fini의 섹션을 사용

    실제로이 같은 메커니즘이 있습니다. 런타임에 섹션이 나타나지 않을 수도 있기 때문에 해당 섹션을 가리키는 DT_INITDT_FINI 동적 태그가 있습니다.

  • 더 새로운 메커니즘 .init_array.fini_arrayDT_INIT_ARRAY, DT_INIT_ARRAYSZ, DT_FINI_ARRAYDT_FINI_ARRAYSZ 동적 태그에 대응한다.

두 메커니즘의 차이점은 here입니다.

__attribute__((constructor))으로 C 함수를 꾸미면 컴파일러는 객체가 dlopen 일 때 실행되도록 두 가지 메커니즘 중 하나를 사용합니다. 동적 초기화가 필요한 전역 C++ 객체의 구성 코드에도 동일하게 적용됩니다.

관련 문제