ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

编译-链接过程备忘录

编译-链接过程备忘录 目录1. 静态库.a / .lib—— 不是链接器生成的2. 动态库.so / .dylib / .dll—— 由链接器生成3. 可执行文件app / exe—— 由链接器生成4.动态库内部藏着两张“符号表”5为什么 strip“通常”没事以及“有事”的例外1. 静态库.a / .lib—— 不是链接器生成的生成工具归档器ar而不是链接器ld。过程编译器先把源码编译成目标文件.o / .obj然后ar命令把这些 .o 文件打包成一个静态库文件。这一步只是“打包”不进行符号解析和重定位即没有“连接”过程。命令ar rcs libmylib.a file1.o file2.o2. 动态库.so / .dylib / .dll—— 由链接器生成生成工具链接器ld带上特殊参数如-shared或-dynamiclib。过程链接器将多个 .o 文件或依赖的静态库进行部分链接。它会解析内部符号但会故意保留外部依赖符号为“未定义”生成一个可重定位且位置无关PIC的共享对象文件。命令gcc -shared -o libmylib.so file1.o file2.o后台实际调用 ld3. 可执行文件app / exe—— 由链接器生成生成工具链接器ld默认模式。过程链接器将所有 .o 文件、静态库复制代码、动态库登记导入表进行完整链接。这一步会把所有静态符号的地址固定下来或留作重定位生成操作系统可以直接加载运行的文件格式ELF / PE / Mach-O。命令gcc -o myapp main.o -lmylib后台调用 ld直观变换流程源码编译.c/.cpp——编译器 cc1plus——.o目标文件二进制机器码但地址是乱的打包成静态库.o文件们——ar 归档器——.a静态库相当于一个 .o 的压缩包没有链接链接生成动态库.o/.a——ld 链接器 -shared——.so动态库半链接状态保留外部跳转钩子链接生成可执行文件.o/.a/.so——ld 链接器默认——app可执行文件全链接状态具备运行入口4.动态库内部藏着两张“符号表”第一张动态符号表.dynsym——这是命根子这张表记录了对外公开的函数名比如int add(int a, int b)。作用当你的可执行文件或其他库要调用这个库时动态链接器就靠这张表里的名字去查找地址。如果这张表没了外部程序就找不到入口加载时会直接报错“undefined symbol”。第二张调试符号表.symtab 行号信息——这是说明书这张表记录了变量名、源码文件名、代码在第几行、甚至函数参数名。作用仅用于 GDB 调试、反汇编时看函数名、或者崩溃时打印堆栈。运行时完全不需要它。5为什么 strip“通常”没事以及“有事”的例外标准 strip 行为Linux大多数 Linux 上的strip命令默认只删除调试符号表第二张而保留动态符号表第一张。所以你在 Linux 上直接strip libxxx.so库能正常跑因为命根子还在。这叫“安全瘦身”。
返回列表