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.