2017-02-17 3 views
2

Meine Anwendung ruft einige Funktionen auf, die in einer externen statischen Bibliothek abgelegt sind. Ich verbinde die externe statische Bibliothek mit meiner Anwendung und alles funktioniert (in diesem Fall verwende ich GCC).Platzieren Sie Segmente der externen statischen Bibliothek an bestimmten Positionen.

Trotzdem werden die Positionen (Adressen) der Text-, .data- und .bss-Abschnitte der Bibliothek vom Linker ausgewählt. Ich kann ihre Speicherorte auswählen/ändern, indem ich das Linker-Skript modifiziere, aber es ist mühsam, da ich alle Funktionen, Variablen usw. der Bibliothek angeben muss. Was ich meine, ist es so etwas wie:

. = 0x1000; /* new location */ 
KEEP(*(.text.library_function1)); 
KEEP(*(.text.library_function2)); 
[...] 

Eine alternative Lösung, indem ein für jede Funktion/Variable Attribut Abschnitt der externe Bibliothek zu bauen, und dann den Linker zu modifizieren, indem den gesamten Abschnitt erneut zu lokalisieren. Etwas wie:

/* C source file */ 
unsigned char __attribute__((section (".myLibrarySection"))) variable1[10]; 
unsigned char __attribute__((section (".myLibrarySection"))) variable2[10]; 

/* Linker script */ 
. = 0x1000; 
KEEP(*(.myLibrarySection)) 

Allerdings würde Ich mag Lage sein, ganze .text zu verlagern, .data und .bss Segmente einer externen statischen Bibliothek, ohne dass diese Tricks.

würde ich so etwas wie dies mag (in Linker-Skript):

. = 0x1000; 
KEEP(*(.text.library_file_name)) 

Ist es möglich, GCC Toolchain verwendet?

Können andere Werkzeugketten (IAR, Keil usw.) verwendet werden?

Antwort

1

Können Sie Ihre lib umbenennen Abschnitte gerade nachbearbeiten?

# Untested! 
TMP=`mktemp -d` 
trap "rm -rf $TMP" EXIT 
cd $TMP 
ar x path/to/your/lib.a 
for o in *.o; do 
    for s in text data bss; do 
    objcopy --rename-section .$s=.mynew$s $o 
    done 
done 
ar rcs path/to/your/lib.a *.o 
1

Sie können die archive:filename Syntax in ld verwenden.

Platzieren Sie zuerst alle .o Dateien aus Ihrer externen Bibliothek in eine statische Bibliothek .a Datei, wenn sie nicht bereits vorhanden sind. Das ist die normale Art und Weise, wie statische Bibliotheksbinärdateien verteilt werden.

Dann in der Linker-Skript, angeben:

.text.special : { 
    . = 0x1000; 
    *libspecial.a:*(.text .text.*) 
} 

.text { 
    *(.text .text.*) 
} 

Der Platzhalter wird alle Dateien aus libspecial.a kommen holen und sie im ersten Abschnitt platzieren. Der spätere Platzhalter wird dann alles auswählen, was übrig ist. Wenn Sie den Abschnitt .text.special nach dem normalen Abschnitt platzieren müssen, können Sie die Anweisung EXCLUDE_FILE auf ähnliche Weise verwenden.

Verwandte Themen