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.
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
@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
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