0
A
回答
2
不,在系統定義的共享對象中沒有標準的「入口點」。使用dlopen()
的給定應用程序可能會定義一個標準符號名稱,以用作此方式加載的模塊的入口點。然後,主機應用程序將使用dlsym()
按名稱查找該符號以調用該符號。
但是大多數應用程序根本不直接使用dlopen - 而且你還沒有解釋爲什麼你認爲你應該這樣做。
2
如果您使用的是GCC或兼容的編譯器,您可以聲明一個函數__attribute__((constructor))
,它將在加載時被調用。喜歡的東西
__attribute__((constructor))
void init()
{
puts("Hello dynamic linkage world!");
}
1
從手冊頁: 過時符號_init()和_fini() 鏈接器可識別特殊符號_init和_fini。如果動態庫導出名爲_init()的例程,那麼在dlopen()返回之前,該代碼在加載後執行 。如果動態庫 導出名爲_fini()的例程,那麼在庫卸載之前,該例程僅調用 。如果您需要避免將 鏈接到系統啓動文件,可以使用gcc(1)-nostartfiles命令行選項來完成此操作。
Using these routines, or the gcc -nostartfiles or -nostdlib options,
is not recommended. Their use may result in undesired behavior,
since the constructor/destructor routines will not be executed
(unless special measures are taken).
**Instead, libraries should export routines using the
__attribute__((constructor)) and __attribute__((destructor)) function
attributes. See the gcc info pages for information on these.
Constructor routines are executed before dlopen() returns, and
destructor routines are executed before dlclose() returns.**
相關問題
- 1. 加載頁面時執行函數
- 2. 當程序集(dll庫)加載時執行初始化函數,卸載時執行清理函數
- 3. 加載jQuery執行函數()
- 4. 如何在每次頁面加載時執行Jquery的函數?
- 5. 函數執行後的加載表
- 6. jQuery - 加載數據後執行函數
- 7. 在加載時執行javascript
- 8. JQuery函數沒有在文檔加載時執行
- 9. 在webOS中加載頁面時執行函數
- 10. 如何在頁面加載時執行角度函數?
- 11. PowerShell中加載函數執行一切
- 12. 執行onload後加載函數
- 13. 如何從動態加載庫執行未知函數?
- 14. 當數據庫完成處理/加載數據時執行宏
- 15. 在加載時加載javascript函數
- 16. 加載/卸載共享庫時執行的代碼
- 17. 加載頁面時的運行函數
- 18. 當完全加載html時Angular 4執行函數
- 19. 當頁面加載時JQuery函數沒有執行
- 20. 當頁面加載時執行一個函數angular
- 21. jquery:加載表單時執行一個函數
- 22. 獲取函數來執行加載網頁時
- 23. 當元素加載時執行javascript函數
- 24. 在XMLHttpRequest加載的頁面執行Javascript函數
- 25. 在YUI的加載標籤中執行javascript函數
- 26. 在加載的特定頁面上執行一個函數
- 27. 如何在執行函數之前等待我的iframe加載?
- 28. 在服務對象中聲明的加載函數不執行
- 29. 在卸載函數執行AJAX調用
- 30. 如何在AngularJs的每次頁面重新加載時執行一些函數?
他們爲什麼不直接使用dlopen? – opc0de
正常應用程序不直接使用它,因爲它們在構建時顯式鏈接到它們所需的共享庫。也就是說,指令被烘焙到每個可執行文件中,告訴加載器加載哪些庫,而不需要應用程序中的任何顯式代碼。您可以通過在可執行文件上運行程序'ldd'來以這種方式自動加載哪些庫。明確使用'dlopen()'是爲實現「插件」體系結構的程序 - 例如程序在運行時不知道它們需要哪些庫。例如:Firefox,Python,Photoshop .... –