Bei der Darstellung von Symbolen im Adressraum mit einem Linkerskript erlaubt ld
auf Bezug auf ein bestimmtes Symbol aus einer statischen Bibliothek mit folgender Syntax :Bezug auf ein bestimmtes Symbol in einer statischen Bibliothek mit dem GNU-Goldlinker
archive.a:object_file.o(.section.symbol_name)
Mit gold
statt ld
, es scheint, dass eine solche Richtlinie ignoriert. Der Verknüpfungsprozess ist erfolgreich. Wenn Sie diese Anweisung jedoch verwenden, um ein spezifisches Symbol an einer bestimmten Position mit gold
zu setzen und das resultierende Symbollayout mithilfe von nm
zu überprüfen oder sich die Map-Datei anzusehen, befindet sich das Symbol nicht in der erwarteten Position .
Ich machte einen kleinen Testfall mit einem Dummy Hallo Welt-Programm statisch kompiliert in seiner entrety mit GCC 5.4.0. Die C-Bibliothek ist muslibc (letzter Commit auf dem Master-Zweig aus dem offiziellen Git-Repository). Für binutils verwende ich auch das letzte Commit auf dem Master-Zweig aus dem offiziellen Git-Repository.
Ich verwende die Linker-Skript ein bestimmtes Symbol (.text.exit
) aus einer statischen Bibliothek (MUSL C-Bibliothek: libc.a
) platzieren an einer bestimmten Stelle im Adressenraum welche ist: die erste Position im Abschnitt .text
.
Mein Linker-Skript ist:
ENTRY(_start)
SECTIONS
{
. = 0x10000;
.text :
{
/* Forcing .text.exit in the first position in .text section */
musl/lib/libc.a:exit.o(.text.exit);
*(.text*);
}
. = 0x8000000;
.data : { *(.data*) }
.rodata : { *(.rodata*) }
.bss : { *(.bss*) }
}
Mein Makefile:
# Set this to 1 to link with gold, 0 to link with ld
GOLD=1
SRC=test.c
OBJ=test.o
LIBS=musl/lib/crt1.o \
musl/lib/libc.a \
musl/lib/crtn.o
CC=gcc
CFLAGS=-nostdinc -I musl/include -I musl/obj/include
BIN=test
LDFLAGS=-static
SCRIPT=linker-script.x
MAP=map
ifeq ($(GOLD), 1)
LD=binutils-gdb/gold/ld-new
else
LD=binutils-gdb/ld/ld-new
endif
all:
$(CC) $(CFLAGS) -c $(SRC) -o $(OBJ)
$(LD) --output $(BIN) $(LDFLAGS) $(OBJ) $(LIBS) -T $(SCRIPT) \
-Map $(MAP)
clean:
rm -rf $(OBJ) $(BIN) $(MAP)
Nach dem Kompilieren und Verknüpfen ich die Map-Datei bin Überprüfung (erhalten unter Verwendung des auf der Landkarte der ld
/gold
Flag) zu Werfen Sie einen Blick auf den Standort .text.exit
. Unter Verwendung ld
als Linker ist es tatsächlich in der ersten Position des Textabschnitts. Mit gold
ist es nicht (es ist weiter im Adressraum vorhanden, als ob meine Direktive nicht berücksichtigt wurde).
Jetzt, während keiner dieser Arbeit mit gold
:
musl/lib/libc.a:exit.o(.text.exit);
musl/lib/libc.a(.text.exit)
Dies funktioniert:
*(.text.exit);
Ist das ein fehlendes Feature in gold
? oder mache ich etwas falsch, vielleicht gibt es eine andere Möglichkeit, auf ein bestimmtes Symbol einer bestimmten Objektdatei in einem Archiv mit gold
verweisen?
Vielen Dank, die Syntax Anführungszeichen gearbeitet. Ich überprüfte auch die Kompilierungsflaggen von Musl, und tatsächlich enthalten diese auch -ffunction-Abschnitte. –