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++ 객체의 구성 코드에도 동일하게 적용됩니다.
관련 문제
- 1. 정적 변수 초기화 코드가 호출되지 않습니다.
- 2. 정적 선언은 언제 실행됩니까?
- 3. .deb가 설치되었을 때 어떤 코드가 실행됩니까?
- 4. 을 감안할 때 정적 초기화
- 5. 코드가 더 빨리 실행됩니까?
- 6. 다음 코드가 autocad에서 실행됩니까?
- 7. 파이썬 코드가 순서대로 실행됩니까
- 8. 정적 블록 - 언제 실행됩니까?
- 9. 클래스 정의시 어떤 코드가 실행됩니까?
- 10. 디버거가 멈 추면 코드가 실행됩니까?
- 11. 왜 드라이버 코드가 먼저 실행됩니까?
- 12. 일반 정적 필드 초기화
- 13. 정적 메서드에서 정적 변수를 초기화 할 수 있습니까?
- 14. 정적 라이브러리 또는 기타
- 15. 주석으로 인해 코드가 느리게 실행됩니까?
- 16. 레일 연관 - 컨트롤러 코드가 실행됩니까?
- 17. 비 정적 메소드 mysqli :: 초기화()는 정적
- 18. Resources를 초기화 할 때 NotFoundException이 발생합니다. Drawable을 초기화 할 때
- 19. new는 윈도우에서 정적 전역 변수를 초기화 할 때 NULL을 반환합니까?
- 20. 비 정적 JPanels를 초기화 할 때 종종 nullpointerexception이 발생합니다.
- 21. 단위 테스트에서 정적 메서드를 호출 할 때 초기화 오류가 발생했습니다.
- 22. 종속성의 경우 정적 초기화
- 23. 초기화 할 때 'glued'배열
- 24. Django - 정적 객체를 초기화 할 위치는 어디입니까?
- 25. 정적 및 정적 정적 멤버 변수는 초기화 할 수 있지만 정적 멤버 변수는 초기화 할 수없는 이유는 무엇입니까?
- 26. 얼마나 자주 초기화 프로그램이 레일에서 실행됩니까?
- 27. 정적 변수 초기화 방법
- 28. 정적 클래스의 정적 포인터를 초기화
- 29. 두 번째 확인란을 선택하면 코드가 실행됩니까? C#
- 30. .NET 디버깅을 중지하면 finally 블록의 코드가 실행됩니까?
http://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work – Brian
@ 브라이언 : 당신이 대답 할 수있을 것 같아요 ...하지만 사용하지 않으면 어떻게 될까요? GCC? 예 : clang 또는 ICC? – einpoklum