在linux下編譯乙個動態庫所用到的libc,能否被靜態編譯進動態庫中?

時間 2021-06-03 08:40:09

1樓:澪同學

有個隱藏的坑你得小心。

現在你把你的庫 a.so 靜態鏈結到了 glibc 某個版本但是你可沒法保證用你庫的人是不是靜態鏈結,比如程式 b 用了你的 a.so 並且動態鏈結或者靜態鏈結了乙個不同的版本甚至不是gnu的libc實現,那問題就大了而且很難檢查出來。

2樓:高辰飛

找個libc.a試試,感覺可以啊

試了下//hello.c

#include "stdio.h"

int main()

yum install glibc-static

2. gcc -static hello.c -o hello

3. strace ./hello

[root@iz2zeic9ggky8iwdmhb3vsz ~]# strace ./hello

execve("./hello", ["./hello"], [/* 22 vars */]) = 0

uname({sysname="Linux", nodename="iz2zeic9ggky8iwdmhb3vszŔ

brk(NULL0x24a2000

brk(0x24a31c00x24a31c0

arch_prctl(ARCH_SET_FS, 0x24a2880) = 0

brk(0x24c41c00x24c41c0

brk(0x24c50000x24c5000

fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 10

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe097df6000

write(1, "hello world!\n", 13hello world13

exit_group(0exited with 0 +++

完全沒有load任何so

3樓:程式碼之詩

這個,應該做不到,或者說,很難做到。因為 libc 的靜態版本並不與它的動態版本完全等價。

對於 hello world 這麼簡單的程式是可以的,象這樣:

gcc -static -o hello hello.c據說有除了 gnu libc 之外的其它 libc 庫,對 static link 比較友好的,這個就是按需取用了。

另外就是,大多數情況下,libc 的靜態鏈結恐怕會比動態版本載入更慢一些。你省下了重定位的時間,卻增加了載入時間——乙個是記憶體操作(libc 肯定早就載入到記憶體了嘛),另乙個卻常常是磁碟操作。

使用linux編譯執行c程式,假如定義乙個區域性變數,是程式執行中由作業系統開闢的空間呢?還是編譯過程?

唐浩然 編譯器是 規劃書 規劃 計畫使用量 作業系統是倉庫管理員,管 具體分配多少量 是否一次性完全分配 或 只分配當前所需 區域性變數在棧裡 只有函式呼叫的時候會分配棧空間,函式反回的時候吐出來這個應該是c規範來約束的,找本c語言的書認真看看。編譯器只是c spec的執行者 雲天明 woc讀錯題了...

關於labview通過動態鏈結庫得到乙個指標,怎麼獲取這個指標指向位址的值?

Scofield Gu 教程來了 過年正好有空自己也正在整理這個問題,因此我就在此分享一下吧。舉個例子,我們這裡說的就是這個minus 函式,希望得到int diff ptr 是diff的指標。我們通過解指標間接得到diff。但是有時候外部提供的dll是指標,需要我們再LV中自己解引用,那麼以下有三...

是否可能存在乙個動態平衡的世界,從而達到所有人共同富裕

身經百戰澤拉圖 您是不是在找 原始共產主義 當人類還在草原和叢林上烤篝火 獵猛獸的時候,也許還沒有什麼 貧富差距 如果是未來,則需要摒棄人類的 權力 才能共同富裕,任何人有權力支配他人,便能佔據優勢地位,則可能積累財富,形成差距。官僚系統帶來了官僚權力,市場經濟帶來了金錢權力,如何構建沒有它們的社會...