2014-04-15 11 views
8

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

Odpowiedz

9

Jest produktem ubocznym sposób .a biblioteki pracują - są po prostu zbiorem .o plików.

Co się dzieje w momencie łącza kompilacji jest to, że pierwsze odniesienie do nazwy zostanie rozwiązany do słabego wykorzystania i silna nazwa nigdy nie dostaje spojrzeć w.

można przetestować to samemu przez faktycznie czyni zarówno identyczną nazwę i silny, a zobaczysz dokładnie to samo zachowanie.

Jeśli chcesz, aby silne odniesienia zostały rozstrzygnięte jako pierwsze, umieść je wcześniej w archiwum lub utwórz osobne silne archiwum i łącze, które najpierw znajdziesz w linku.

Chociaż nie stosuje się bezpośrednio do twojej sprawy, ponieważ korzystasz z osadzonego środowiska, słabe kontra silne referencje wchodzą w życie prawidłowo podczas tworzenia/konsumowania bibliotek dynamicznych zamiast archiwów Gdy utworzysz .so, wszystkie słabe odniesienia, które tworzą bibliotekę, nie wygenerują błędu, a tylko jeden z nich zostanie użyty do końcowego produktu; a jeśli istnieje silna definicja, to używa się raczej niż słabych (to działa tylko wtedy, gdy tworząc .so łączysz wszystkie pliki .o, które tworzą osobno, lub używasz --whole-archive podczas tworzenia .so, jeśli łączysz się z .a).

+1

Nie sądzę, że korzystanie z bibliotek współdzielonych jest możliwe w systemie wbudowanym (w zasadzie bez systemu operacyjnego). – Quentin

+2

@Quentin Ostatni akapit był krótki "kiedy występuje słaba/silna rozdzielczość". Przeredaguję akapit – Petesh

+0

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

Powiązane problemy