gcc link鏈接常用選項及應用
如需轉載請標明出處:http://blog.csdn.net/itas109
QQ技術交流羣:129518033
文章目錄
相關問題:
1.跨操作系統程序編寫等應用
2.通用linux應用程序
環境:
OS : Centos 7
編譯器: g++ 4.8.5
1.前言
gcc的link選項只有在目標文件鏈接到可執行文件時,link選項才生效。
瞭解link選項,有利於可執行文件的深入理解。例如,跨操作系統程序編寫等應用。
2.常用link選項
2.1 -flinker-output=type
重要程度(1 - 5):1
此選項控制鏈接時間優化器的代碼生成。默認情況下,鏈接器輸出由鏈接器插件自動確定。
2.2 -llibrary
(-l library
)(★)
重要程度(1 - 5):5
鏈接時搜索名爲library的庫
鏈接器在標準目錄列表中搜索該庫。搜索的目錄包括幾個標準系統目錄以及-L
指定的任何目錄
靜態庫文件名類似於liblibrary.a
。共享庫文件名類似於liblibrary.so
。如果同時找到了靜態庫和共享庫,則鏈接器將優先選擇與共享庫鏈接,除非的使用 -static
選項
2.3 PIE(Position Independent Executable)
重要程度(1 - 5):3
PIE能用來創建介於共享庫和通常可執行代碼之間的代碼–能像共享庫一樣可重分配地址的程序
- -pie
生成位置無關的可執行文件。通常配合-fpie
,-fPIE
使用 -no-pie
不生成位置無關的可執行文件-static-pie
生成位置無關的靜態可執行文件。通常配合-fpie
,-fPIE
使用
2.4 -pthread
(★)
重要程度(1 - 5):5
與POSIX線程庫鏈接。GNU / Linux、Unix以及x86 Cygwin和MinGW目標都支持此選項。
gcc -o simple simple.c -lpthread
2.5 動態鏈接庫和靜態鏈接庫(★)
重要程度(1 - 5):5
-shared
產生一個共享對象,然後可以將其與其他對象鏈接以形成可執行文件。需要配合-fpic
,-fPIC
使用
gcc -fPIC -shared hello.c -o libhello.so
-static
生成靜態可執行文件。
gcc main.c -lhello -L. -static -o main
2.6 libgcc
(★)
重要程度(1 - 5):5
-shared-libgcc
鏈接動態libgcc庫
-static-libgcc
鏈接靜態libgcc庫
g++ -o hello hello.cpp -static-libgcc -static-libstdc++
2.7 -static-libstdc++
(★)
重要程度(1 - 5):5
當g++程序用於鏈接C ++程序時,通常會自動鏈接到libstdc++
。如果 libstdc++
可以作爲共享庫使用,並且-static
的 選項未使用,則此鏈接指向的共享版本 libstdc++
g++ -o hello hello.cpp -static-libgcc -static-libstdc++
2.8 其他
-e entry
-lobjc
-nodefaultlibs
-nostdlib
-nolibc
-r
-rdynamic
-s
-static-libasan
-static-libtsan
-static-liblsan
-static-libubsan
-symbolic
-T script
-Xlinker option
-Wl,option
-u symbol
-z keyword
3.應用
// hello.cpp
#include <iostream>
using namespace std;
int main() {
cout << "hello world" << endl;
return 0;
}
- 普通編譯
$ g++ -o hello hello.cpp
$ ./hello
hello world
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=cef26c0f4878e3835d81a548fcca0a61701ec14a, not stripped
$ ldd hello
linux-vdso.so.1 => (0x00007fff9019e000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f9f48cf7000)
libm.so.6 => /lib64/libm.so.6 (0x00007f9f489f5000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f9f487df000)
libc.so.6 => /lib64/libc.so.6 (0x00007f9f48412000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9f48ffe000)
- 靜態編譯
$ sudo yum install glibc-static libstdc++-static
$ g++ -o hello hello.cpp -static
$ ./hello
hello world
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=ab5abd481d857b3f35e7514e687993717bd5c742, not stripped
$ ldd hello
不是動態可執行文件
- 半靜態編譯
$ sudo yum install glibc-static libstdc++-static
$ g++ -o hello hello.cpp -static-libgcc -static-libstdc++
$ ./hello
hello world
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=89c7bf8e8f31d34f7c5ac899264b7fe069ec2108, not stripped
$ ldd hello
linux-vdso.so.1 => (0x00007fff20d4b000)
libm.so.6 => /lib64/libm.so.6 (0x00007f800fee0000)
libc.so.6 => /lib64/libc.so.6 (0x00007f800fb13000)
/lib64/ld-linux-x86-64.so.2 (0x00007f80101e2000)
License
License under CC BY-NC-ND 4.0: 署名-非商業使用-禁止演繹
如需轉載請標明出處:http://blog.csdn.net/itas109
QQ技術交流羣:129518033
Reference:
1.https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html