2014-05-16 11 views
21

Ho un problema nel collegare alcune librerie condivise con g ++. Mi dà un avvertimento del tipo:Che cosa significa esattamente l'avviso riguardo al simbolo nascosto a cui fa riferimento DSO?

hidden symbol XXX in YYY is referenced by DSO /usr/lib/... 

Ho letto alcune questioni connesse su particolari problemi, ma voglio capire in un tutto - Che cosa significa questo avvertimento e ciò che è una causa:

  1. Che cos'è DSO?
  2. Che cos'è un simbolo nascosto?
  3. Come può essere referenziato, se è nascosto?
+0

DSO = oggetto dinamico condiviso –

risposta

19

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 Xdinamicamente (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.

+0

Non capisco l'ultima parte della risposta. Se il simbolo nascosto è già referenziato da qualche DSO, allora perché il problema è con DSO? - In realtà, posso confermare che il problema si presenta con un oggetto non condiviso, che definisce alcuni simboli possibilmente con lo stesso nome, che il DSO conosce come esterni: sono forniti in un altro posto. Inoltre, non nascondo esplicitamente quei simboli nel mio oggetto non condiviso. –