2012-01-26 18 views
8

Supponiamo di avere due librerie statiche che non sono state create da me e che non ho alcun controllo sul loro contenuto.Impedisci l'importazione di funzioni dalla libreria statica

Biblioteca 1 ha funzioni:

A() 
B() 
C() 

Biblioteca 2 ha funzioni:

A() 
D() 
E() 

Entrambi hanno bisogno di essere collegato in un'applicazione chiamata, ma il conflitto di denominazione di A() tiri errori.

C'è un modo per dire "Ignora A() dalla Libreria 1 quando si collega" in linux usando gcc e ld.

+0

Probabilmente vale la pena menzionare la tua toolchain. Il solito, GNU gcc e ld? – Thomas

+0

Aggiunto, è in GCC e ld. – tpg2114

risposta

6

ci sono un paio di metodi che io sappia:

  1. si potrebbe fare una copia della libreria che ha il simbolo corrispondente nascosto, e il collegamento contro la copia. Non è necessario accedere a una delle fonti per il codice della libreria per fare ciò: objcopy può farlo con l'opzione --localize-symbol. Descrivere come farlo con i file .o in this answer a una domanda simile, ma lo stesso metodo funziona altrettanto bene con le librerie .a.

  2. È possibile utilizzare --allow-multiple-definition option. (Se stai collegando tramite un comando gcc, piuttosto che con ld direttamente, dovrai specificare l'opzione come -Wl,--allow-multiple-definition.) Ciò farà sì che il linker smetta di preoccuparsi della definizione multipla, e usa semplicemente il primo che incontri invece - quindi devi stare attento a quale ordine le librerie appaiono nella riga di comando. Il rovescio della medaglia è che è un'opzione globale, quindi se si hanno altri scontri di simboli inaspettati, potrebbe fare la cosa sbagliata invece di raccontartelo.

Problemi correlati