Binutils 2.45 (binary only)
- Homepage: https://www.gnu.org/software/binutils/
 - Manpage: https://sourceware.org/binutils/docs/
 - Changelog: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob_plain;f=binutils/NEWS
 - Repository: https://sourceware.org/git/binutils-gdb.git
 - Package: master/make/pkgs/binutils-tools/
 - Maintainer: @Ircama
 
Overview
Binary analysis and manipulation utilities from GNU Binutils package plus patchelf. Essential for debugging, inspecting, and analyzing ELF binaries.
Installation
Select in menuconfig:
Debug helpers ---> binary-tools
Available Tools
All tools operate on ELF (Executable and Linkable Format) binaries:
readelf- Display information about ELF files (headers, sections, symbols)objdump- Display object file information (disassembly, sections)objcopy- Copy and translate object filesnm- List symbols from object filesstrings- Print printable strings from binary filesar- Create, modify, and extract from archives (.a files)ranlib- Generate index for archive contentsstrip- Discard symbols and debug information from binariesaddr2line- Convert addresses to file/line numbers (debugging)size- List section sizes and total size of binariespatchelf- Modify ELF dynamic linker and RPATH (runtime library paths)
Usage Examples
Inspecting Binaries
# Display ELF header information
readelf -h /usr/bin/python3
# List all symbols in a binary
nm /usr/bin/python3
# Disassemble a binary (MIPS assembly)
objdump -d /usr/bin/python3
# Show dynamic library dependencies
readelf -d /usr/bin/python3 | grep NEEDED
# Display section sizes
size /usr/bin/python3
Debugging
# Find source location of crash address
addr2line -e /usr/bin/python3 0x00400abc
# Extract strings from binary (useful for reverse engineering)
strings /usr/bin/python3 | grep -i "error"
# Check if binary is stripped
file /usr/bin/python3
Binary Manipulation
# Strip debug symbols to reduce size
strip --strip-debug /tmp/mybinary
# Create static library archive
ar rcs libmylib.a obj1.o obj2.o obj3.o
ranlib libmylib.a
# Copy binary and change section names
objcopy --rename-section .data=.rodata mybinary mybinary.new
# Fix dynamic linker path (useful for Freetz-NG SEPARATE_AVM_UCLIBC)
patchelf --set-interpreter /usr/lib/freetz/ld-uClibc.so.1 /usr/bin/mybinary
# Change RPATH to use custom library location
patchelf --set-rpath /usr/lib/freetz /usr/bin/mybinary
# View current interpreter and RPATH
patchelf --print-interpreter /usr/bin/mybinary
patchelf --print-rpath /usr/bin/mybinary
Common Use Cases
1. Debugging Crashes
When a program crashes, use readelf and addr2line to identify the problem:
# Program crashed at address 0x00405678
readelf -s /usr/bin/myprogram | grep "00405678"
addr2line -e /usr/bin/myprogram 0x00405678
2. Analyzing Dependencies
Check which libraries a binary needs:
readelf -d /usr/bin/python3 | grep NEEDED
# Output shows required .so files
3. Fixing Dynamic Linker Issues
When binaries fail with "not found" errors for the dynamic linker:
# Check current interpreter
readelf -l /usr/bin/mybinary | grep interpreter
# Fix it with patchelf
patchelf --set-interpreter /usr/lib/freetz/ld-uClibc.so.1 /usr/bin/mybinary
# Verify the change
readelf -l /usr/bin/mybinary | grep interpreter
This is especially useful when cross-compiling binaries or when using FREETZ_SEPARATE_AVM_UCLIBC=y.
4. Reverse Engineering
Extract information from unknown binaries:
# Find human-readable strings
strings /bin/unknown_binary
# List exported functions
nm -D /lib/libssl.so.1.1
# Disassemble specific function
objdump -d /usr/bin/binary | grep -A 20 "function_name"
4. Reducing Binary Size
Strip unnecessary symbols:
# Before
size mybinary
# text    data     bss     dec     hex filename
# 123456  45678   12345  181479  2c4e7 mybinary
# Strip debug info
strip --strip-debug mybinary
# After (smaller)
size mybinary
Integration with GCC Toolchain
Binary-tools is automatically selected when installing the full GCC toolchain:
Debug helpers ---> GCC (Native Compiler for On-Device Compilation)
  [ ] Minimal installation (GCC + essential tools only)
Minimal installation: Includes only ld, as, ar, ranlib (essential for compilation)
Full installation: Includes all binary-tools utilities
Troubleshooting
"command not found"
Binary-tools must be externalized to USB storage:
# Check if tools are externalized
ls -la /var/media/ftp/uStor01/freetz-external/binary-tools/
# If not, run externalization
modsave flash
Wrong Architecture Binaries
Binary-tools are MIPS binaries that run on the router. They analyze any architecture's ELF files, but they themselves must run on MIPS.
# This works (MIPS binary analyzing x86 file)
readelf -h /tmp/x86_binary.elf
# This won't work (trying to run x86 binary on MIPS router)
./x86_binary
# bash: ./x86_binary: cannot execute binary file
Performance Considerations
objdump -d(disassembly) on large binaries can be slow- Use grep to filter output: 
objdump -d binary | grep pattern - Consider copying binaries to RAM for faster analysis: 
cp /var/media/ftp/file /tmp/ 
See Also
- GCC Toolchain - Native compiler for on-device development
 - strace - System call tracer (runtime debugging)
 - gdb - GNU Debugger (interactive debugging)
 - GNU Binutils Documentation