mcpField
B
binutils

binutils

github.com/mohitmishra786开发269619 次安装18 周前更新
代码仓库

关于 binutils

面向 Agent 的 GNU Binutils 工具集使用技能,介绍静态库管理、二进制剥离、地址映射、符号反混淆和节操作。

主要功能

  1. 01使用 ar 创建和查看静态库
  2. 02用 strip 移除调试信息
  3. 03用 objcopy 分离调试信息并操作节
  4. 04用 addr2line 将地址映射到源码
  5. 05用 c++filt 解析 C++ 符号

适用场景

  1. 01创建或检查静态库
  2. 02从二进制中分离调试文件
  3. 03将崩溃地址定位到源码行
  4. 04解析崩溃日志中的 C++ 符号

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill binutils

安装后在 Claude Code 中输入/binutils确认已加载。

附带文件references/cheatsheet.md

详细介绍

GNU Binutils

用途

指导 Agent 使用 binutils 工具集处理二进制文件,包括静态库、剥离符号、地址到源码映射以及符号反修饰。

触发条件

  • “如何创建静态库?”
  • “如何剥离二进制文件,同时保留调试文件?”
  • “我有一个崩溃地址——如何找到对应的源码行?”
  • “如何反修饰 C++ 符号名?”
  • “如何提取或替换二进制文件中的节?”

工作流

1. ar — 静态库管理
# Create static library
ar rcs libfoo.a foo.o bar.o baz.o

# List contents
ar t libfoo.a

# Extract an object
ar x libfoo.a foo.o

# Add/replace an object
ar r libfoo.a newbar.o

# Delete an object
ar d libfoo.a oldbar.o

# Show symbol index
nm libfoo.a

# Rebuild symbol index (after modifying archive externally)
ranlib libfoo.a

对于 LTO 归档文件,请使用 gcc-ar/gcc-ranlib 或 llvm-ar,而不是普通的 ar。

2. strip — 移除调试信息
# Strip all debug info (reduce binary size)
strip --strip-all prog

# Strip only debug sections (keep symbol table)
strip --strip-debug prog

# Strip unneeded symbols (keep needed for linking)
strip --strip-unneeded prog

# In-place
strip prog

# To a new file
strip -o prog.stripped prog
3. objcopy — 二进制文件节操作
# Separate debug info from binary
objcopy --only-keep-debug prog prog.debug
objcopy --strip-debug prog

# Add debuglink (GDB finds prog.debug automatically)
objcopy --add-gnu-debuglink=prog.debug prog

# Convert binary to another format
objcopy -O binary prog prog.bin      # raw binary (embedded)
objcopy -O srec prog prog.srec       # Motorola S-record

# Add a section from a file
objcopy --add-section .resources=data.bin prog

# Remove a section
objcopy --remove-section .comment prog

# Change section flags
objcopy --set-section-flags .data=alloc,contents,load,readonly prog

# Embed a binary file as a symbol
objcopy -I binary -O elf64-x86-64 \
    --rename-section .data=.rodata,alloc,load,readonly,data,contents \
    data.bin data.o
# Then link data.o; access via _binary_data_bin_start / _binary_data_bin_end
4. addr2line — 地址到源码的映射
# Convert a crash address to source:line
addr2line -e prog -f 0x400a12
# Output:
# my_function
# /home/user/src/main.c:42

# Multiple addresses
addr2line -e prog -f 0x400a12 0x400b34 0x400c56

# Inline frames (-i)
addr2line -e prog -f -i 0x400a12

# Common use: pipe from backtrace output
cat crash.log | grep '0x[0-9a-f]' | grep -o '0x[0-9a-f]*' | \
  addr2line -e prog -f -i

要求二进制文件包含调试信息(使用 -g 编译)。对于已剥离符号的二进制文件,请使用未剥离的版本或 .debug 文件。

5. c++filt — 反修饰 C++ 符号
# Demangle a single symbol
c++filt _ZN3foo3barEv
# Output: foo::bar()

# Demangle from nm output
nm prog | c++filt

# Demangle from crash log
cat crash.log | c++filt

替代方法:nm -C prog(直接在 nm 中反修饰)。

6. strings — 提取可打印字符串
strings prog                    # all strings >= 4 chars
strings -n 8 prog               # minimum length 8
strings -t x prog               # with offset (hex)
strings -t d prog               # with offset (decimal)

# Search for specific strings
strings prog | grep "version"
strings prog | grep "Copyright"
7. readelf 和 objdump 快速参考

(完整内容见 skills/binaries/elf-inspection)

# Symbol lookup for crash address (alternative to addr2line)
objdump -d -M intel prog | grep -A5 "400a12:"

# Find which object file defines a symbol
objdump -t prog | grep my_function
8. 交叉编译 binutils

进行交叉编译时,请使用带目标前缀的版本:

aarch64-linux-gnu-strip prog
aarch64-linux-gnu-objcopy --only-keep-debug prog prog.debug
aarch64-linux-gnu-addr2line -e prog 0x400a12
arm-none-eabi-nm libfirmware.a

如需涵盖所有工具(ar、strip、objcopy、addr2line、strings、c++filt)的完整命令速查表,请参阅 references/cheatsheet.md。

相关技能

  • 使用 skills/binaries/elf-inspection 检查 readelf、nm、ldd、objdump
  • 使用 skills/binaries/linkers-lto 了解链接器标志和 LTO
  • 使用 skills/debuggers/core-dumps 通过 objcopy --add-gnu-debuglink 管理调试文件

评论

支持 Markdown