Re: [問題] 請問vc中的__declspec(dllexport),GCC …

看板C_and_CPP作者 (好人超)時間15年前 (2010/06/03 12:15), 編輯推噓2(2017)
留言19則, 3人參與, 最新討論串2/4 (看更多)
剛剛測試了一下,供你做參考 相關的知識可以看這個網站:http://tinyurl.com/yt3zmu -- share.c 開始 -- int add(int x, int y) { return x + y; } -- share.c 結束 -- 編譯指令:gcc share.c -shared -fPIC -o libshare.so 編譯之後,把 libshare.so 這個檔案擺到 /usr/lib 底下 (這個步驟有沒有更好的替代方案呢?) -- test.c 開始 -- int add(int x, int y); int main() { int result = add(10, 20); } -- test.c 結束 -- 編譯指令:gcc test.c -lshare 這樣 ./a.out 執行就沒有問題了 (這是在 Linux 底下測試的,不知道 Mac 是不是相同) (話說我不太懂 -fPIC 這個參數的意義…查了資料也不知所以然 orz) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.171.46 ※ 編輯: james732 來自: 140.117.171.46 (06/03 20:16) ※ 編輯: james732 來自: 140.117.171.46 (06/03 20:16)

06/03 20:20, , 1F
改LD_LIBRARY_PATH 不知道會不會太囉嗦 XD?
06/03 20:20, 1F

06/03 20:24, , 2F
我在linux下寫dll,幾乎都是用LD_PRELOAD,不過用途
06/03 20:24, 2F

06/03 20:25, , 3F
不太一樣就是了
06/03 20:25, 3F

06/03 23:35, , 4F
PIC 全名網頁就有我就不說了。主要是讓產生出來的 asm
06/03 23:35, 4F

06/03 23:36, , 5F
採用相對定址法代替直接定址法。因為同一份 text 會 share
06/03 23:36, 5F

06/03 23:37, , 6F
給不同的 process 用,產生的 machine code 不能隨便用
06/03 23:37, 6F

06/03 23:37, , 7F
絕對位址。
06/03 23:37, 7F

06/03 23:38, , 8F
LD_PRELOAD 的用途比較偏向 debug 之類的,像是抓 memory
06/03 23:38, 8F

06/03 23:38, , 9F
leakage 的 lib,可以設在那裡面,把 malloc() / free()
06/03 23:38, 9F

06/03 23:39, , 10F
之類的 symbol 先搶下來變成自己的版本,就能多做一些事。
06/03 23:39, 10F

06/03 23:40, , 11F
正常來說用 -lxxx 去 link .so 的話,
06/03 23:40, 11F

06/03 23:40, , 12F
還是以 LD_LIBRARY_PATH 為主。
06/03 23:40, 12F

06/03 23:41, , 13F
不過原 po 又在推文中說過他是用「load」的,
06/03 23:41, 13F

06/03 23:41, , 14F
這讓我比較懷疑他是不是沒用 -lxxx 這種方法,而是採用
06/03 23:41, 14F

06/03 23:42, , 15F
dlopen() + dlsym() 之類的動態載入和連結機制。
06/03 23:42, 15F

06/03 23:43, , 16F
如果是這樣,Linux 需要使用 -ldl 連結 libdl.so,
06/03 23:43, 16F

06/03 23:44, , 17F
但 FreeBSD 的這些函式是內建在 BSD 版的 libc,
06/03 23:44, 17F

06/03 23:44, , 18F
所以不需要加上任何參數。我聽說 MacOSX 跟 FreeBSD 很像
06/03 23:44, 18F

06/03 23:44, , 19F
,所以先補充這一點。
06/03 23:44, 19F
文章代碼(AID): #1C1vpVWU (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1C1vpVWU (C_and_CPP)