2013-03-10 17 views
7

mam aplikacji, która ma funkcję f1 void f1()funkcje ukrywanie w C

Ponadto mam bibliotekę ładować za pomocą LD_PRELOAD.

Biblioteka ma kilka plików kodowych i kilka plików nagłówkowych i jest skompilowana do pliku .so.

W pliku nagłówkowym używana jest również funkcja o nazwie f1 z taką samą sygnaturą jak powyżej. Najnowsza f1 jest używana tylko w bibliotece. (Nie można go zmienić na metodę statyczną). Problem polega na tym, że po załadowaniu biblioteki (przy użyciu LD_PRELOAD) f1 z biblioteki zastępuję f1 aplikacji.

Czy istnieje sposób skonfigurowania biblioteki f1 tak, aby była widoczna tylko dla biblioteki?

+2

Czy istnieje powód, dla którego nie można zmienić nazwy jednej z deklaracji funkcji? Zgaduję, że jest to w istniejącej bazie kodu, co może być powodem, dlaczego nie można – Bojangles

Odpowiedz

5

Jeśli można modyfikować pliki nagłówkowe w ogóle, należy funkcję static aby był on widoczny tylko w tej jednostce kompilacji, lub zaznaczyć go __attribute__ ((visibility ("hidden"))) (GCC), aby był on widoczny tylko w tej biblioteki:

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

jest '__attribute__ ((widoczność (" ukryty ")))' makro, które zastępuje statyczne **? ** lub jak to działa? –

+1

@GrijeshChauhan: Nie, ten atrybut oznacza symbol jako ukrytą widoczność. Widoczne jest tylko * wewnątrz tej współużytkowanej biblioteki * (coś w rodzaju przeciwieństwa Win32 'DLLEXPORT'). Ukryty atrybut widoczności jest przekazywany i rozumiany przez linker (w przeciwieństwie do 'statycznego', który czyni symbol zasadniczo * niewidoczny * dla linkera). – nneonneo

+0

Bardzo dziękuję !! .. –

3

Można również skompilować bibliotekę za pomocą -fvisibility=hidden i użyć jawnej __attribute__ ((visibility ("default"))) dla kilku funkcji biblioteki, które muszą być widoczne.