2013-03-10 16 views
7

Ho un'applicazione che ha una funzione f1 void f1()funzioni nasconde in C

Inoltre, ho una libreria che io carico usando LD_PRELOAD.

La libreria ha diversi file di codice e diversi file di intestazione e viene compilata nel file .so.

Nei file di intestazione viene utilizzata anche una funzione denominata f1 con la stessa firma di cui sopra. L'ultimo f1 viene utilizzato solo nella libreria. (Non posso cambiare al metodo statico)

Il problema è che quando carico biblioteca (utilizzando LD_PRELOAD) f1 dalle sostituzioni biblioteca f1 dell'applicazione.

C'è un modo per configurare f1 della libreria per essere visibile solo alla libreria?

+2

C'è un motivo per cui non si può semplicemente rinominare una delle dichiarazioni di funzione? Immagino che questo sia in un codice esistente che potrebbe essere il motivo per cui non puoi – Bojangles

risposta

5

Se è possibile modificare i file di intestazione a tutti, rendere la funzione static per renderlo visibile solo in quella unità di compilazione, o contrassegnare con __attribute__ ((visibility ("hidden"))) (GCC solo) per renderlo visibile solo in quella libreria:

__attribute__ ((visibility ("hidden"))) void f1(); 
+0

È '__attribute__ ((visibilità (" hidden ")))' macro che sostituisce con static **? ** o come funziona? –

+1

@GrijeshChauhan: No, quell'attributo contrassegna un simbolo come dotato di visibilità nascosta. È visibile solo * all'interno di quella libreria condivisa * (un po 'come l'opposto di Win32 'DLLEXPORT'). L'attributo della visibilità nascosta è passato e compreso dal linker (al contrario di 'static', che rende fondamentalmente * invisibile * il simbolo al linker). – nneonneo

+0

Bello grazie !! .. –

3

È anche possibile compilare la libreria con -fvisibility=hidden e utilizzare __attribute__ ((visibility ("default"))) esplicita per le poche funzioni della libreria che devono essere visibili.