2013-01-23 12 views
5

Mam bibliotekę innej firmy A, która wymaga pewnej biblioteki B. A jest połączone z binarikiem, który jest połączony z wersją statyczną B. Dlatego nie ma już potrzeby w dynamicznej wersji B.Usuwanie wpisu z sekcji DYNAMIC pliku elfa

A nie jest pod moją kontrolą i nie można go przekompilować. Dlatego chcę usunąć wpis NEEDED libA z DYNAMIC sekcji A.

Czy można to zrobić za pomocą objcopy lub innego narzędzia?

+1

Kursy wynoszą 90% lub więcej, więc usunięcie wpisu POTRZEBA spowoduje nierozwiązywalny błąd symbolu (jeśli masz szczęście) lub nieprawidłowo działający program (jeśli nie masz tyle szczęścia ze względu na powielanie danych, które muszą być unikalne). Powinieneś ponownie połączyć binarną z dynamiczną wersją biblioteki B. – zwol

+0

@Zack Łączę mój plik binarny ze statyczną wersją B, więc nie powinno być nierozwiązanych symboli. Czy nadal myślisz, że będę miał problem? – dimba

+0

Tak. Twój plik binarny zawiera tylko podzbiór B, z którego korzysta sam binarny. Prawdopodobnie nie jest to również odpowiednie dla A. Dlaczego łączenie się z dynamiczną wersją B jest problemem? – zwol

Odpowiedz

1

Czy można to zrobić za pomocą objcopy lub innego narzędzia?

Nie znam żadnego istniejącego narzędzia, które może to zrobić, chociaż może być w stanie uzyskać elfsh.

Jest to dość trywialne napisać program w C do robienia tego, co chcesz: sekcja .dynamic od libA.so jest tabela rekordów o stałej wielkości (typu ElfW(Dyn)), zakończone wpisem z .d_type == DT_NULL. Aby pozbyć się konkretnego wpisu DT_NEEDED, po prostu "przesuń" wszystkie następne pozycje w górę (nadpisując entry[n] z entry[n+1] itd.). To pozostawi twój .dynamic z dwoma wpisami DT_NULL na końcu, ale nic nie powinno się nigdy przejmować.

Jeden komplikacją jest to, że jeśli libB.so zawiera wersjonowanych symboli libA.so referencje, wtedy nie będzie dodatkowych odniesień do libB.so w DT_VERNEED stole, a te są trudniejsze do pozbyć. Jeśli nie pozbędziesz się referencji VERNEED, dynamiczny linker zawiedzie asercje.