Voglio creare una libreria .a statica per il mio progetto da più fonti, alcune definiscono funzioni deboli e altre le implementano. Diciamo che come esempio ho:Sovrascrivi simboli deboli nella libreria statica
lib1.c:
void defaultHandler()
{
for(;;);
}
void myHandler() __attribute__((weak, alias ("defaultHandler")));
lib2.c:
void myHandler()
{
/* do my stuff here */
}
allora voglio metterli in una singola libreria, in modo che sembra trasparente per l'applicazione finale
$ ar -r libhandlers.a lib1.o lib2.o
Ma v'è ora 2 simboli myHandler
in libhandlers:
$ nm libhandlers.a | grep "myHandler"
00000001 W myHandler
00000581 T myHandler
E quindi quando si utilizza la lib, il riferimento debole è collegato. L'unica soluzione che ho per il momento è di non includere nella libreria lib2.c
ma aggiungerla come sorgente nel Makefile dell'applicazione ... non è soddisfacente dato che mi piacerebbe fornire solo poche librerie da usare e non un intero gruppo di file.
L'opzione --whole-archive
non è soddisfacente in quanto lavoro su sistemi embedded e non voglio includere tutte le cose che non mi servono.
C'è un modo per compilare la libreria in modo che il simbolo debole scompaia se ne viene fornito uno forte?
NOTA: sto usando il braccio-nessuno-EABI-gcc v4.8
Non credo che l'utilizzo di librerie condivise sia possibile su sistemi embedded (praticamente nessun sistema operativo) – Quentin
@Quentin L'ultimo paragrafo era un breve "quando si verifica la risoluzione debole/forte". Riformulerò il paragrafo – Petesh
Da quello che spiegate, dovrebbe essere possibile risolvere il problema eseguendo un file .o univoco da 'lib1.c' e 'lib2.c' e poi inserirli in .a (insieme ad altri file .o), ho ragione? – Quentin