2012-01-26 24 views
8

Powiedzmy, że mam dwie statyczne biblioteki, które nie zostały zbudowane przeze mnie i nie mam kontroli nad ich zawartością.Zapobieganie importowaniu funkcji z biblioteki statycznej

Biblioteka 1 ma funkcje:

A() 
B() 
C() 

Biblioteka posiada 2 funkcje:

A() 
D() 
E() 

Obie muszą być połączone do aplikacji wywołującej ale nazywanie konflikt A() wyrzuca błędy.

Czy istnieje sposób, aby powiedzieć „Ignoruj ​​A() z biblioteki 1 podczas łączenia” w Linuksie za pomocą gcc i LD.

+0

Prawdopodobnie warto wspomnieć o Twoim narzędziu narzędziowym. Zwykle GNU gcc i ld? – Thomas

+0

Dodano, jest w GCC i ld. – tpg2114

Odpowiedz

6

Istnieje kilka metod, które znam:

  1. Można utworzyć kopię biblioteki, która ma odpowiedni symbol ukryty, a ogniwo w stosunku do kopii. Aby to zrobić, nie potrzebujesz dostępu do żadnego źródła kodu biblioteki: objcopy można to zrobić za pomocą opcji --localize-symbol. Opisuję to w plikach .o w this answer na podobne pytanie, ale ta sama metoda działa równie dobrze z bibliotekami .a.

  2. --allow-multiple-definition option mogą być wykorzystane. (Jeśli łączysz za pomocą polecenia gcc, zamiast z ld bezpośrednio, musisz określić opcję jako -Wl,--allow-multiple-definition.) Spowoduje to, że linker przestanie dbać o wiele definicji i po prostu użyje pierwszego, zamiast tego spotkania - musisz więc uważać, w jakiej kolejności pojawiają się biblioteki w linii poleceń. Wadą jest to, że jest to opcja globalna, więc jeśli masz inne niespodziewane zderzenia symboli, może to zrobić złą rzecz zamiast powiedzieć ci o tym.

Powiązane problemy