ld
(链接器)是 Linux 系统中用于将一个或多个目标文件(object files)链接成一个可执行文件(executable file)的工具
基本语法:
ld [options] [object-files...]
常用选项:
-o output-file
:指定输出文件的名称。如果不指定,链接器会使用第一个目标文件的名称作为输出文件名。-s
:去除符号表信息,减小生成的可执行文件大小。-static
:静态链接,将所有依赖的库文件直接嵌入到可执行文件中,生成一个独立的可执行文件。-dynamic
:动态链接,不将依赖的库文件嵌入到可执行文件中,而是生成一个包含动态链接信息的可执行文件。-fPIC
:生成位置无关代码(Position Independent Code),使得生成的目标文件可以在内存中任意位置运行。-I
:指定库文件的搜索路径。-L
:指定库文件的搜索路径。-l
:链接指定的库文件。例如,-lmysql
表示链接 MySQL 库。-shared
:生成一个共享库文件(shared library)。-multi-arch
:支持多架构链接,例如,当为目标文件指定了不同的架构时,链接器会尝试为每个架构生成一个可执行文件。
注意事项:
- 链接顺序:链接器按照指定的顺序处理目标文件和库文件。如果一个目标文件依赖于另一个目标文件或库文件,需要确保它们在正确的顺序下链接。
- 符号解析:链接器会解析符号表,将函数和变量的符号地址解析为实际地址。如果一个符号在多个目标文件或库文件中定义,链接器会报错。
- 重定位:链接器会对目标文件中的代码进行重定位,使得它们在正确的内存地址上运行。这通常涉及到对绝对地址的修改和对相对地址的修改。
- 动态链接库:动态链接库(shared library)在运行时被加载到内存中,多个程序可以共享同一个动态链接库实例,从而节省内存空间。但是,动态链接库的更新可能会导致运行中的程序崩溃,因为它们的符号地址可能会发生变化。