看板 C_and_CPP 關於我們 聯絡資訊
剛剛測試了一下,供你做參考 相關的知識可以看這個網站: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)
Bencrie:改LD_LIBRARY_PATH 不知道會不會太囉嗦 XD? 06/03 20:20
loveflames:我在linux下寫dll,幾乎都是用LD_PRELOAD,不過用途 06/03 20:24
loveflames:不太一樣就是了 06/03 20:25
tinlans:PIC 全名網頁就有我就不說了。主要是讓產生出來的 asm 06/03 23:35
tinlans:採用相對定址法代替直接定址法。因為同一份 text 會 share 06/03 23:36
tinlans:給不同的 process 用,產生的 machine code 不能隨便用 06/03 23:37
tinlans:絕對位址。 06/03 23:37
tinlans:LD_PRELOAD 的用途比較偏向 debug 之類的,像是抓 memory 06/03 23:38
tinlans:leakage 的 lib,可以設在那裡面,把 malloc() / free() 06/03 23:38
tinlans:之類的 symbol 先搶下來變成自己的版本,就能多做一些事。 06/03 23:39
tinlans:正常來說用 -lxxx 去 link .so 的話, 06/03 23:40
tinlans:還是以 LD_LIBRARY_PATH 為主。 06/03 23:40
tinlans:不過原 po 又在推文中說過他是用「load」的, 06/03 23:41
tinlans:這讓我比較懷疑他是不是沒用 -lxxx 這種方法,而是採用 06/03 23:41
tinlans:dlopen() + dlsym() 之類的動態載入和連結機制。 06/03 23:42
tinlans:如果是這樣,Linux 需要使用 -ldl 連結 libdl.so, 06/03 23:43
tinlans:但 FreeBSD 的這些函式是內建在 BSD 版的 libc, 06/03 23:44
tinlans:所以不需要加上任何參數。我聽說 MacOSX 跟 FreeBSD 很像 06/03 23:44
tinlans:,所以先補充這一點。 06/03 23:44