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"?