一、链接过程详解
1)gcc会对.c文件默认进行预处理操作,-c再来指明了编译、汇编,从而得到.o文件, 所以gcc -c -o hello.o hello.c
就把链接前的步骤完成了
2) 链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序
-
系统库文件
- crt1.o、crti.o、crtbegin.o、crtend.o、crtn.o是gcc加入的系统标准启动文件对于一般应用程序,这些启动是必需的
gcc -v -nostdlib -o hello hello.o
会提示因为没有链接系统标准启动文件和标准库文件,而链接失败- -nostdlib选项常用于裸机/bootloader、linux内核等程序,因为它们不需要启动文件、标准库文件。
- 一般应用程序才需要系统标准启动文件和标准库文件;裸机/bootloader、linux内核等程序不需要启动文件、标准库文件。
-
库文件
比如:程序中用到的printf就是链接到里libc库文件,通过libc库文件实现了printf函数。
二、动态链接和静态链接区别
- 动态链接
- 动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行。
- 动态链接生成的程序体积较小,但是必须依赖所需的动态库,否则无法执行。
gcc -o hello_shared hello.o
默认就是动态链接
- 静态链接
- 静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行
- 不过静态链接生成的程序体积较大
gcc -static -o hello_static hello.o
-static选型,进行静态链接