2017-08-03 9 views
1

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?

Antwort

0

Wenn Symbole im Adressraum eines Linker Skript Auslegen finden ld ermöglicht auf ein bestimmtes Symbol aus einer bestimmten Objektdatei in einer statischen Bibliothek mit folgenden Syntax kommen:

Archiv. a: Objektdatei.o (.section.symbol_name)

Das ist nicht ganz das, was diese Syntax bedeutet. Wenn Sie ".section.symbol_name" im Linker-Skript (oder in einer Readelf oder objdump Liste der Abschnitte) sehen, das ist der gesamte Name des Abschnitts, und Sie nur Abschnitte mit Namen wie das, wenn Sie sehen Verwenden Sie beim Kompilieren die Option -funktionsabschnitte. Vorausgesetzt, dass Ihr Skript mit ld arbeitet, und wenn Sie nur die volle Dateiname Wildcard mit gold verwenden, sieht es so aus, als ob Ihre Mussel-Bibliotheken tatsächlich mit -ffunction-Abschnitten kompiliert wurden, aber das ist nichts, was Sie immer annehmen können ist wahr für Systembibliotheken. Der Linker sucht also nicht wirklich nach einem Abschnitt mit dem Namen ".text", der ein Symbol mit dem Namen "exit" definiert - stattdessen sucht er einfach nach einem Abschnitt mit dem Namen ".text.exit" ( ). Subtile Unterschied, aber Sie sollten sich dessen bewusst sein.

Jetzt, während keiner von ihnen arbeiten mit Gold: MUSL/lib/libc.a: exit.o (.text.exit); musl/lib/libc.a (.text.exit);

Dies funktioniert: * (. Text.exit);

Ist das eine fehlende Funktion 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 zu verweisen?

Wenn man sich die resultierende auf der Landkarte der Ausgabedatei sehen, vermute ich, Sie der Name der Objektdatei geschrieben wird als „MUSL/lib/libc.a (exit.o)“ sehen werden. Das ist die Schreibweise, die Sie im Skript verwenden müssen, und aufgrund der Klammern müssen Sie es angeben. Diese:

"musl/lib/libc.a(exit.o)"(.text.exit) 

sollte funktionieren. Wenn Sie wollen etwas, das in den beiden Linker funktionieren wird, versuchen etwas wie folgt aus:

"musl/lib/libc.a*exit.o*"(.text.exit) 

oder nur

"*exit.o*"(.text.exit) 
+0

Vielen Dank, die Syntax Anführungszeichen gearbeitet. Ich überprüfte auch die Kompilierungsflaggen von Musl, und tatsächlich enthalten diese auch -ffunction-Abschnitte. –

Verwandte Themen