gcc link鏈接常用選項及應用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章