Che cos'è un DSO?
Un DSO è un Dynamic Shared Object, o meno formalmente una shared library.
Che cos'è un simbolo nascosto?
Un nascosto simbolo è un simbolo (ad esempio nome della funzione o un oggetto di dati) che è stato compilato con linkage nascosto, ad esempio come da (GCC specifico) dichiarazione:
int x __attribute__ ((visibility ("hidden")));
Se x
è definito in una DSO poi collegamento dinamico non può fare riferimento da un diverso DSO. Il linker può vedere x
(non è static
), ma non è disponibile per collegamento dinamico. Documentazione here
Come si può fare riferimento, se è nascosto?
Non può essere, che è ciò di cui si è stati avvertiti. Per esempio. l'avvertimento LINKTIME:
simbolo nascosto `stat' in /usr/lib/libc_nonshared.a(stat.oS) fa riferimento DSO
vi sta dicendo che un DSO nel collegamento fa riferimento al simbolo stat
, e il linker possono individuare una definizione di stat
in /usr/lib/libc_nonshared.a
, ma (ovviamente) che la definizione non è nel DSO che fa riferimento a esso e non è possibile fare riferimento da quella DSO, perché è nascosta.
Si verifica questo problema se il problema DSO non è stato creato correttamente per l'uso come DSO. Vedere this example e seguire i follow-up per la soluzione.
continuato per followup di OP
Se simbolo nascosto è già riferito da alcuni DSO, allora perché il problema è con DSO?
Il linker sta dicendo:
Il DSO X
contiene un riferimento al simbolo S
. Riesco a trovare una definizione di simbolo S
è un altro modulo legato Y
, ma tale definizione non sarà disponibile per soddisfare il riferimento X
dinamicamente (cioè in fase di esecuzione) perché S
ha nascosto linkage in Y
.
Posso confermare che il problema si presenta con un oggetto non condiviso [...] [ma] Non nascondo esplicitamente quei simboli nel mio oggetto non condiviso.
È possibile che non sia stato esplicitamente contrassegnato alcun simbolo nascosto nell'oggetto non condiviso. A seconda di come è stato creato, i simboli possono essere nascosti di default a meno che non venga indicato esplicitamente altrimenti.
Dire che l'oggetto non condiviso è libnonshared.a
e il simbolo presumibilmente nascosto è foo
. Run:
objdump -t libnonshared.a
per ottenere informazioni sui simboli di libnonshared.a
. Nell'output, cercare la voce per foo
. Contiene il tag .hidden
? - per esempio.
0000000000000000 g F .text 000000000000000b .hidden foo
Questa voce dice che foo
è un simbolo globale (contrassegnato g
- è per questo che il linker è in grado di vedere) ma è nascosto per dinamica linkage.
Se questo risulta essere il caso, è necessario andare e correggere la build di libnonshared.a
in modo che non nasconda foo
. Se no, allora sono perplesso.
DSO = oggetto dinamico condiviso –