一、链接过程详解

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选型,进行静态链接