2010-04-21 23 views
7

Piszę skrypt rozruchowy dla urządzenia opartego na ARM-Cortex M3. Jeśli skompiluję skrypt rozruchowy asemblera i kod aplikacji C, a następnie połączę pliki obiektów i przetransferuję je do mojego urządzenia, wszystko działa.GNU ld usuwa sekcję

Jednakże, jeśli mogę użyć ar stworzyć archiwum (libboot.a) i połączyć to archiwum z aplikacji C pojawia się problem:

Włożyłam kodu startowego w sekcji:

.section .boot, "ax" 
    .global  _start 

_start: 
    .word  0x10000800 /* Initial stack pointer (FIXME!) */ 
    .word  start 
    .word  nmi_handler 
    .word  hard_fault_handler 
    ... etc ... 

Zauważyłem, że ld usuwa to z końcowego pliku binarnego (sekcja "boot" nie jest dostępna). Jest to całkiem naturalne, ponieważ nie ma na nim zależności, o której wie, ale powoduje, że urządzenie nie uruchamia się poprawnie.

Moje pytanie brzmi: jaki jest najlepszy sposób na wymuszenie włączenia tego kodu?

Odpowiedz

10

Spróbuj dodać coś takiego:

KEEP(*(.boot)) 

w skrypcie ld łącznikowej powiedzieć linker utrzymać sekcję .boot.

Nie jestem jednak pewien, czy to wystarczy, aby ld mógł pobrać dowolne obiekty z archiwum, które znajdują się w sekcji .boot - może w ogóle nie traktować obiektu, chyba że powoduje to jakiś symbol w tym obiekcie Jeśli jest to problem, rozwiązaniem może być określenie _start jako punktu wejścia (użycie -e _start na linii poleceń ld lub użycie ENTRY(_start) w skrypcie linkera).

3

Myślę, że chcesz przekazać linker opcji --no-gc-sections. Od GNU ld documentation:

--gc-sections 
--no-gc-sections 

Enable garbage collection of unused input sections. 

`--gc-sections' decides which input sections are used 
by examining symbols and relocations. The section 
containing the entry symbol and all sections containing symbols 
undefined on the command-line will be kept, as will sections 
containing symbols referenced by dynamic objects. 
Note that when building shared libraries, the linker must 
assume that any visible symbol is referenced. Once this initial 
set of sections has been determined, the linker recursively marks 
as used any section referenced by their relocations. 
See `--entry' and `--undefined'. 
2

Łącznik będzie wyodrębnić tylko z archiwum te obiekty niezbędne do rozstrzygnięcia jawnie odwołuje symboli. Kod startowy nie jest jawnie przywoływany, ponieważ jest wywoływany przez wektor resetowania.

Jeśli kod startowy zawiera wiele modułów należy utworzyć częściowo połączony obiektu pliku za pomocą LD i opcję -r/--relocatable, to będzie łączyć obiekty w jeden obiekt, bez konieczności rozwiązywania wszystkich symboli (takich jak main() na przykład). To może być następnie wykorzystane w pełnym łączu z kodem aplikacji. Jeśli jest to tylko pojedynczy plik obiektowy, to nie ma żadnej realnej korzyści w tworzeniu archiwum (i jak się okazało, nie będzie działać).

Należy zauważyć, że tradycyjnie uruchomienie systemu wykonawczego GNU C jest dostarczane w pliku o nazwie crt0.o (nie archiwum), prawdopodobnie z tego samego powodu.

1

Możesz użyć opcji ld --whole-archive, aby pobrać symbole bez odniesień. Ten ld options page ma to dla całego archiwum --whole-archiwum

każdego archiwum wymienionego w wierszu poleceń w po --whole-archiwum opcji, to każdy plik obiektu w archiwum w linku zamiast wyszukiwania w archiwum wymaganych plików obiektów . Zwykle jest to używane do przekształcania pliku archiwum w udostępnioną bibliotekę , wymuszając każdy obiekt, który ma być zawarty w wynikowej bibliotece współdzielonej . Ta opcja może być używana więcej niż jeden raz.
Dwie uwagi podczas korzystania z tej opcji z gcc: Po pierwsze, gcc nie zna tej opcji, więc musisz użyć -Wl, -whole-archive. Po drugie, nie zapomnij użyć -Wl, -nie-cały-archiwum po liście archiwów, ponieważ gcc doda własną listę archiwów do twojego linku i możesz nie chcieć tej flagi wpływać na te jako dobrze.

zobaczyć również na to pytanie na przepełnienie stosu, uses of whole-archive option

2

Można użyć --whole-archive podczas łączenia, ale jest to duży pistolet słoni. Roszczenia stron man:

każdego archiwum wymienionego w wierszu poleceń po opcji --whole-archive, to każdy plik wynikowy w archiwum w linku zamiast przeszukiwania archiwum dla wymaganych plików obiektowych.