objcopy ist ein Werkzeug aus den GNU Binutils, das Objektdateien und ausführbare Dateien kopiert und dabei gezielt umbaut: Sektionen entfernen, hinzufügen oder umbenennen, Formate konvertieren und Debug-Informationen auslagern. Es ist der Allrounder für alles, was unterhalb der Compiler-Ebene mit dem Datei- und Sektionslayout passiert.

Formate konvertieren

Mit -O (output target) legt man das Ausgabeformat fest. Der wichtigste Fall für die Embedded-Entwicklung ist -O binary: objcopy erzeugt ein rohes Speicherabbild ohne ELF-Header, Relokationen und Symbole — genau das, was man für Firmware oder Bootloader direkt auf den Flash schreiben kann.

objcopy -O binary -R .eh_frame firmware.elf firmware.bin
objcopy -O ihex program.elf program.hex

Debug-Informationen auslagern

Kombiniert man --only-keep-debug und --add-gnu-debuglink, entsteht eine zweiteilige Distribution: eine schlanke Binärdatei für den Betrieb und eine separate Debug-Datei für den Debugger. gdb sucht die Debug-Datei automatisch über den eingebetteten Debuglink.

objcopy --only-keep-debug program program.debug
objcopy --add-gnu-debuglink=program.debug program
strip program

Sektionen manipulieren

-S bzw. --strip-all entfernt die Symboltabelle (siehe strip-Befehle), --remove-section .comment löscht einzelne Sektionen, --only-section .text extrahiert genau eine Sektion, --rename-section und --redefine-sym benennen Sektionen beziehungsweise Symbole um. Damit lassen sich Binärdateien für spezielle Ladeadressen anpassen (--change-addresses). Wie nm und objdump gehört objcopy zur Analyse- und Umbau-Kette rund um Linker und Compiler.

Verwandte Grundlagen: size-Befehle, strings-Befehle, readelf-Befehle.