2008-11-29 6 views
22

Ich habe ein funktionierendes Linker-Skript. Ich möchte einen weiteren Datenabschnitt hinzufügen, dessen Inhalt direkt aus einer Datei gezogen wird (ld sollte es nicht analysieren und die Abschnitte usw. extrahieren). Wie kann ich das machen?Include Binärdatei mit GNU ld Linker-Skript

OUTPUT_FORMAT("elf32-i386") 
ENTRY(start) 
SECTIONS 
{ 
    .text 0x100000 : { 
    *(.multiboot) 
    *(.text) 
    *(.code) 
    *(.rodata*) 
    } 
    .data : { 
    *(.data) 
    } 
    .bss : { 
    *(.bss) 
    } 
    kernel_end = .; 
    roottask_start = .; 
    .data : { 

    HERE I WANT TO INCLUDE THE ENTIRE CONTENTS OF ANOTHER (BINARY) FILE 

    } 
    roottask_end = .; 
} 
+0

GCC: https://stackoverflow.com/questions/4864866/cc-with-gcc-static-add-resource-files-to-executable-library –

Antwort

16

könnten Sie versuchen, objcopy mit es zu einem normalen Objekt konvertieren Sie verknüpfen in können und dann ihre Symbole im Linker Skript verweisen, wie Sie zu einem normalen Objekt tun würden. Vom objcopy manual page:

-B bfdarch --binary-Architektur = bfdarch Nützlich, wenn eine unformatierte binäre Eingabedatei in ein Objekt Datei umzuwandeln. In diesem Fall kann die Ausgabearchitektur auf bfdarch gesetzt werden. Diese Option wird ignoriert, wenn die Eingabedatei eine bekannte bfdarch hat. Sie können auf diese Binärdaten innerhalb eines Programms zugreifen, indem Sie auf die Sonderzeichen verweisen, die durch den Konvertierungsprozess erstellt werden. Diese Symbole heißen _binary_objfile_start, _binary_objfile_end und _binary_objfile_size. z.B. Sie können eine Bilddatei in eine Objektdatei transformieren und dann in Ihrem Code mit diesen Symbolen darauf zugreifen.

... wo objfile wird den Namen der Eingabeobjektdatei erweitert werden.

Siehe auch die --rename-section Option.

+0

Der 'bfdarch' Text ist nicht wörtlich gemeint (und ist nicht erforderlich). Zum Verwechseln siehe [Verknüpfen beliebiger Daten mit der gcc arm toolchain] (http://stackoverflow.com/questions/17265950/linking-arbitrary-data-using-gcc-arm-toolchain). –

5

Eine andere Lösung besteht darin, ein zweites Linkerskript zu generieren, das Byte aus Ihrer Binärdatei enthält, mit der BYTE-Funktion, und es dann in das frühere Linkerskript unter Verwendung der INCLUDE-Direktive aufzunehmen.

Sie können das Skript aus Ihrer Binärdatei mit hexdump auf folgende Weise erzeugen:

cat ramelfs | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' > ramelfs.ld 

Und dann sind auf diese Weise:

SECTIONS { 
    .text : { 

     /* ... */ 

     kramelfs = .; 
     INCLUDE "ramelfs.ld" ; 
     kramelfs_end = .; 

     /* ... */ 
    } 
} 
6

Sie RAW-Datei separaten Abschnitt setzen können in Assembly, und fügen Sie dann diesen Abschnitt in Linker-Skript ein.

Zunächst müssen Sie Vorlage .S-Datei erstellen, z.

.section .rawdata 
.incbin "blob1.raw" 

... und Linker-Skript ändern um diesen Abschnitt zu schließen, wie es Ihnen gefällt:

.data : { 

    *(.rawdata*) 

} 

Sie auch einen Blick hier here für ein bisschen mehr detaillierte Informationen über .S Vorlage nehmen.

Verwandte Themen