其他
处理二进制、静态库与崩溃地址时用 GNU binutils…
当需要使用 ar、strip、objcopy、addr2line、c++filt、strings 等 GNU binutils 工具管理静态库、处理二进制、定位崩溃地址或解码符号时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 57/100 ×0.15
适用场景
处理二进制、静态库与崩溃地址时用 GNU通用
解决思路
- 用 ar rcs libfoo.a foo.o bar.o baz.o 创建静态库。
- 用 ar t libfoo.a 列出静态库内容。
- 用 ar x libfoo.a foo.o 从静态库提取目标文件。
- 用 ar r libfoo.a newbar.o 向静态库添加或替换目标文件。
- 用 ar d libfoo.a oldbar.o 从静态库删除目标文件。
- 用 nm libfoo.a 查看静态库符号索引。
- 外部修改归档后,用 ranlib libfoo.a 重建符号索引。
- 处理 LTO 归档时,用 gcc-ar/gcc-ranlib 或 llvm-ar 替代普通 ar。
- 用 strip --strip-all prog 剥离全部调试信息以减小二进制体积。
- 用 strip --strip-debug prog 仅剥离调试节但保留符号表。
- 用 strip --strip-unneeded prog 剥离不需要的符号,同时保留链接所需符号。
- 用 strip prog 原地剥离二进制。
- 用 strip -o prog.stripped prog 将剥离结果输出到新文件。
- 用 objcopy --only-keep-debug prog prog.debug 从二进制分离调试信息,再用 objcopy --strip-debug prog 剥离原二进制中的调试信息。
- 用 objcopy --add-gnu-debuglink=prog.debug prog 添加 debuglink,使 GDB 自动找到 prog.debug。
- 用 objcopy -O binary prog prog.bin 将二进制转换为 raw binary,用于嵌入式场景。
- 用 objcopy -O srec prog prog.srec 将二进制转换为 Motorola S-record。
- 用 objcopy --add-section .resources=data.bin prog 从文件添加节。
- 用 objcopy --remove-section .comment prog 移除指定节。
- 用 objcopy --set-section-flags .data=alloc,contents,load,readonly prog 改变节标志。
- 用 objcopy -I binary -O elf64-x86-64 --rename-section .data=.rodata,alloc,load,readonly,data,contents data.bin data.o 将二进制文件嵌入为符号,然后链接 data.o,并通过 _binary_data_bin_start / _binary_data_bin_end 访问。
- 用 addr2line -e prog -f 0x400a12 将崩溃地址转换为源码位置,输出函数名和 /home/user/src/main.c:42。
- 用 addr2line -e prog -f 0x400a12 0x400b34 0x400c56 一次转换多个地址。
- 用 addr2line -e prog -f -i 0x400a12 展开内联帧。
- 从 backtrace 输出管道转换地址:cat crash.log | grep '0x[0-9a-f]' | grep -o '0x[0-9a-f]*' | addr2line -e prog -f -i。
- addr2line 要求二进制包含调试信息(用 -g 编译);对已剥离二进制,使用未剥离版本或 .debug 文件。
- 用 c++filt _ZN3foo3barEv 解码单个 C++ 符号,输出 foo::bar()。
- 用 nm prog | c++filt 解码 nm 输出中的 C++ 符号。
- 用 cat crash.log | c++filt 解码崩溃日志中的 C++ 符号。
- 替代方案:用 nm -C prog 在 nm 中直接解码 C++ 符号。
- 用 strings prog 提取所有长度 >=4 的可打印字符串。
- 用 strings -n 8 prog 设置最小字符串长度为 8。
- 用 strings -t x prog 显示十六进制偏移。
- 用 strings -t d prog 显示十进制偏移。
- 用 strings prog | grep "version" 搜索特定字符串。
- 用 strings prog | grep "Copyright" 搜索版权字符串。
- 用 objdump -d -M intel prog | grep -A5 "400a12:" 作为 addr2line 的替代,查找崩溃地址附近的反汇编。
- 用 objdump -t prog | grep my_function 查找哪个目标文件定义了指定符号。
- 交叉编译时使用目标前缀的 binutils:aarch64-linux-gnu-strip prog。
- 交叉编译时使用目标前缀的 binutils:aarch64-linux-gnu-objcopy --only-keep-debug prog prog.debug。
- 交叉编译时使用目标前缀的 binutils:aarch64-linux-gnu-addr2line -e prog 0x400a12。
- 交叉编译时使用目标前缀的 binutils:arm-none-eabi-nm libfirmware.a。
- 查看 references/cheatsheet.md 获取覆盖所有工具的完整命令速查表。
适用边界 · 注意事项
- addr2line 要求二进制包含调试信息(用 -g 编译);对已 strip 且没有 .debug 文件的二进制无法还原源码行。
- LTO 归档不要用普通 ar/ranlib,应使用 gcc-ar/gcc-ranlib 或 llvm-ar。
- 需要完整 readelf、nm、ldd、objdump ELF 检查、链接器/LTO 配置或 core dump 调试文件管理时,应使用对应的专门技能。