Chcę utworzyć statyczną bibliotekę .a dla mojego projektu z wielu źródeł, niektóre z nich definiują słabe funkcje, a inne je implementują. Powiedzmy, że jako przykład mam:Zastąp słabe symbole w bibliotece statycznej
lib1.c:
void defaultHandler()
{
for(;;);
}
void myHandler() __attribute__((weak, alias ("defaultHandler")));
lib2.c:
void myHandler()
{
/* do my stuff here */
}
Następnie chcę, aby umieścić je w jednej bibliotece, tak że wydaje się przejrzysta dla aplikacja koniec
$ ar -r libhandlers.a lib1.o lib2.o
Ale jest teraz 2 symbole myHandler
w libhandlers:
$ nm libhandlers.a | grep "myHandler"
00000001 W myHandler
00000581 T myHandler
A następnie, gdy używasz biblioteki, słaby odnośnik jest połączony. Jedyne rozwiązanie, jakie mam na razie, to nie włączać do biblioteki lib2.c
, ale dodać ją jako źródło w Makefile aplikacji ... to nie jest satysfakcjonujące, ponieważ chciałbym udostępnić tylko kilka bibliotek, a nie całą masę plików.
Opcja --whole-archive
również nie jest satysfakcjonująca, ponieważ pracuję w systemie wbudowanym i nie chcę uwzględniać wszystkich rzeczy, których nie potrzebuję.
Czy istnieje sposób na kompilację biblioteki, tak aby słaby symbol zniknął, jeśli jest silny?
UWAGA: Używam ARM-none-EABI-gcc v4.8
Nie sądzę, że korzystanie z bibliotek współdzielonych jest możliwe w systemie wbudowanym (w zasadzie bez systemu operacyjnego). – Quentin
@Quentin Ostatni akapit był krótki "kiedy występuje słaba/silna rozdzielczość". Przeredaguję akapit – Petesh
Z tego, co wyjaśnisz, powinno być możliwe rozwiązanie problemu poprzez zrobienie unikalnego pliku .o z 'lib1.c' i 'lib2.c', a następnie umieścić go w .a (wraz z innymi plikami .o), czy mam rację? – Quentin