Cross compile tools

Für das Reverse Engineering von embedded Linux Geräten sind oft statisch gelinkte Binaries von strace, gdb und busybox hilfreich.

Statisch gelinkte Binaries funktionieren unabhängig von den Bibliotheken wie libc, die auf dem System installiert sind, sie müssen nur für die korrekte CPU Architektur übersetzt worden sein.

Wir benutzen zur Zeit die toolchains von https://musl.cc musl libc erlaubt es einfach komplett statisch gelinkte Binaries zu erstellen, mit der glibc ist dieses komplizierter.

Bitte die toolchains mit -cross.tgz verwenden.

git clone https://github.com/strace/strace.git
cd strace/

Die toolchain in den Pfad aufnehmen.

export PATH=$PATH:/home/hauke/wifi-cam/mipsel-linux-musl-cross/bin/

Jetzt kann strace gebaut werden. Die host variable muss dem toolchain Namen gleichen. Beim bauen muss -static zu den LDFLAGS hinzugefügt werden.

./bootstrap
./configure --host=mipsel-linux-musl
make  LDFLAGS=-static

Die strace Applikation ist jetzt 3.8M groß, mit strip können unnötige Debugsymbole entfernt werden:

/home/hauke/wifi-cam/mipsel-linux-musl-cross/bin/mipsel-linux-musl-strip strace
wget ftp://ftp.gnu.org/gnu/gdb/gdb-9.1.tar.xz
tar xf gdb-9.1.tar.xz
cd gdb-9.1/
mkdir build
cd build/

Die toolchain in den Pfad aufnehmen.

export PATH=$PATH:/home/hauke/wifi-cam/mipsel-linux-musl-cross/bin/

gdb hat einen Fehler beim bauen mit der musl libc:

../../gdb/mips-linux-nat.c:34:10: fatal error: sgidefs.h: No such file or directory
   34 | #include <sgidefs.h>
      |          ^~~~~~~~~~~
compilation terminated.

Dieses Problem lässt sich durch diesen einfachen Patch beheben:

--- a/gdb/mips-linux-nat.c
+++ b/gdb/mips-linux-nat.c
@@ -31,7 +31,7 @@
 #include "gdb_proc_service.h"
 #include "gregset.h"
 
-#include <sgidefs.h>
+#include <asm/sgidefs.h>
 #include "nat/gdb_ptrace.h"
 #include <asm/ptrace.h>
 #include "inf-ptrace.h"

gdb braucht etwas mehr Argument um statisch zu linken und source-highlight muss deaktiviert werden für statisches linken sonst kompiliert gdb nicht.

../configure --host=mipsel-linux-musl --enable-static=yes --disable-shared --with-static-standard-libraries --disable-source-highlight
make LDFLAGS=-static

Die Anwendungen liegen jetzt in gdb/gdb und gdb/gdbserver/gdbserver.

Die Debugsymbole machen ca. 90% der größe aus, nachdem sie entfernt wurden ist der gdb 8.8MB und der gdbserevr 900KB groß.

/home/hauke/wifi-cam/mipsel-linux-musl-cross/bin/mipsel-linux-musl-strip gdb/gdb
/home/hauke/wifi-cam/mipsel-linux-musl-cross/bin/mipsel-linux-musl-strip gdb/gdbserver/gdbserver
  • ctf/compile.txt
  • Last modified: 2021/04/18 12:35
  • by 127.0.0.1