我有一個基於linux的防火牆設備,它具有glibc-2.3.4,並且沒有gcc編譯程序。 當我通過另一臺Linux機器編一個程序,錯誤消息指出:在Linux下使用不同的glibc庫編譯C程序
需要glibc.x.x.x
如何我在另一個Linux機器上編譯C程序該版本的glibc的?
我有一個基於linux的防火牆設備,它具有glibc-2.3.4,並且沒有gcc編譯程序。 當我通過另一臺Linux機器編一個程序,錯誤消息指出:在Linux下使用不同的glibc庫編譯C程序
需要glibc.x.x.x
如何我在另一個Linux機器上編譯C程序該版本的glibc的?
apbuild-apgcc工具設置的東西可以鏈接到老版本的glibc符號。
這是非常好的答案,但我想使用inotify它是在內核2.6.13和更高版本中,但是使用apgcc我可以不使用它。 – hamSh 2010-08-16 07:09:25
通常,您必須使用適當的建築環境,其中包含具有所需或兼容版本的所有目標庫。 libc變體之間的區別不僅在於鏈接庫名稱本身。例如,所需的配置文件可能有所不同。一些接口可以提供標題級內聯包裝器,這些包裝器在版本之間進行了變異。運行一個更新的庫版本的二進制文件通常是安全的,但是與舊的版本無關。但是,如果您的系統中另外安裝了目標libc的開發包,則可以使用-nostdinc和-nostdlib開關(或顯式調用鏈接器)直接與它構建二進制文件,並明確指定所需的庫。這個例子可以從gcc -v
輸出得到。從我的系統,它的最終連接命令:
/usr/bin/ld --eh-frame-hdr -V -dynamic-linker /libexec/ld-elf.so.1 \ -o t /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o \ -L/usr/lib -L/usr/lib /tmp//ccCb5j33.o -lgcc --as-needed -lgcc_s \ --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed \ /usr/lib/crtend.o /usr/lib/crtn.o
根據目標libc中的細節,就應該更換一些指令到另一個人。尤其是,啓動(crt1.o和crti.o),清除(crtend.o,crtn.o),libc本身(顯式路徑而不是-lc)將被替換;可選地,同樣應該滿足動態鏈接器。
P.S.我看到這是太舊的問題,但它已被重新編輯剛剛:)
[還有一個類似的問題](http://stackoverflow.com/questions/2071325/relink-a-shared-library-to-a - 不同版本-的-libc中)。 – 2010-08-15 21:53:25