2010-03-03 16 views
6

Sto trovando che quando collego un eseguibile con una libreria statica (.a), i simboli della libreria statica finiscono per essere esportati dal file eseguibile. Vorrei evitare questo ed esportare nulla.Evitare l'esportazione di simboli dagli eseguibili su Linux

Ho provato a fornire uno script di versione, ma sembra non fare alcuna differenza. Il contenuto del mio script versione sono le seguenti:

{ 
    global: 
     main; 
    local: 
     *; 
}; 

C'è un modo per non esportare i simboli da un file eseguibile durante il collegamento in una libreria statica? Non riesco a ricompilare la libreria statica stessa.

risposta

7

eseguibili non esportano i simboli di default, e non lo faranno a meno di utilizzare -Wl, - export-dinamica. Questo è necessario solo se stai caricando dinamicamente le librerie che devono collegarsi ai simboli nell'eseguibile principale (questo è un caso comune in C++ se le tue librerie contengono classi che sovrascrivono i metodi virtuali nell'exe)

Forse tu " confondere i simboli di esportazione con i simboli di debug. I simboli di debug verranno prodotti a beneficio del debugger (se non si elimina l'exe), ma non è necessario eseguirlo.

+1

Sembra che gcc 4.8.2 (su arch linux) esporti i nomi delle funzioni di exec per impostazione predefinita, event if -fvisibility = hidden è usato. E solo l'aggiunta di -s al linker rimuove i simboli. – aisbaa

3

Utilizzare strip?

$ man strip

+0

La striscia non interromperà i simboli di esportazione eseguibili, in caso affermativo, in quanto elimina solo le informazioni di debug. – MarkR

+1

@MarkR: leggi la pagina man per strip - può rimuovere molto più dei semplici simboli di debug –

+0

Ma se rimuovi le sezioni che devono essere eseguite, il binario non verrà più eseguito, ovviamente :) – MarkR

Problemi correlati