2011-07-29 14 views
10

Buduję coś takiego jak w pytaniu How to collect data from different .a files into one array? How to keep sections in .a files with ld script?, tj. Tablice złożone podczas łączenia w czasie elementów z różnych plików obiektów.Wstrzykiwanie sekcji do skryptu GNU ld; kompatybilność skryptów między wersjami binutils.

W moim przypadku istnieje kilka tablic, z których każda przechodzi do własnej sekcji, .ld_comp_array_ *, gdzie * pasuje do nazwy tablicy. Wtedy biorę skrypt linkera przy użyciu domyślnego ld --verbose i zmodyfikować go, umieszczając te wszystkie sekcje (sortowane, tak że elementy różnych tablic nie dostać mieszany) w sekcji wyjściowej:

KEEP (*(SORT_BY_NAME(.ld_comp_array*))) 

i wszystko działa w porządku.

Potem sytuacja staje się nieco bardziej skomplikowana, ponieważ aplikacje korzystające z tej funkcji mogą być budowane na różne platformy - do tej pory z powodzeniem wypróbowałem AVR Xmega jako platformę docelową, a także 32-bitowe i 32-bitowe wersje systemu Windows. Linux 32- i 64-bit do testowania jednostkowego, a lista jest otwarta (nowe platformy prawdopodobnie zostaną dodane w niedalekiej przyszłości).

Jednak dla każdej konkretnej platformy domyślne skrypty linkera są inne niż na innych platformach, a obecnie ręcznie wstawiam sekcje .ld_comp_array * - czy będzie to możliwe automatycznie? Jedyne rozwiązanie, o którym myślałem, to analizowanie domyślnego skryptu i wklejanie powyższego opisu sekcji wejściowej, ale wydaje się to zbyt trudne.

Mogę zrobić to ręcznie, jeśli nie ma względnie prostego rozwiązania, ale nie jestem pewien, czy domyślne skrypty uzyskane z lokalnej wersji ld mogą zostać uszkodzone w innej wersji binutils. Czy ktoś może wyjaśnić, czy jest to bezpieczne, czy nie?

W przypadku, gdy można to zrobić automatycznie, czy można "wstrzyknąć" specyfikację sekcji wejściowej zawsze bezpośrednio do sekcji tekstowej, zakładając, że tablice mają być "niezmienne"?

Odpowiedz

15

Znalazłem satysfakcjonujące rozwiązanie tego problemu. GNU ld ma opcję INSERT, która sprawia, że ​​skrypt obsługiwany zewnętrznie nie zastępuje domyślnego skryptu, ale po prostu dodaje nową sekcję na pozycji względem sekcji istniejącej w domyślnym skrypcie.

Więc w moim przypadku skrypt przeszedł do łącznika może być tak proste, jak:

SECTIONS 
{ 
    .rodata.ld_comp_array : 
    { 
    *(SORT_BY_NAME(.ld_comp_array*)) 
    } 
} 
INSERT AFTER .rodata; 

Więcej na opcji Insert: http://sourceware.org/binutils/docs/ld/Miscellaneous-Commands.html#Miscellaneous-Commands

Powiązane problemy