Tylko po to, aby podać ci kontekst, oto, co próbuję osiągnąć: Umieszczam znak const * w pliku obiektu współdzielonego, aby mieć ciąg wersji w samym pliku .so. Przeprowadzam analizę danych i ten ciąg pozwala mi przekazać dane, która wersja oprogramowania je wygenerowała. Wszystko działa dobrze.Przesunięcie w wartości symbolu nm?
Problem, który mam, to próba bezpośredniego odczytania ciągu znaków z biblioteki .so. Próbowałem użyć
nm libSMPselection.so | grep _version_info
i dostać
000000000003d968 D __SMPselection_version_info
to wszystko jest w porządku i zgodnie z oczekiwaniami (char * nazywa _SMPselection_version_info). Jednak oczekiwałbym, że teraz będę mógł otworzyć plik, postarać się 0x3d968 i zacząć czytać mój ciąg znaków, ale wszystko, co dostaję, to śmieci.
Kiedy otwieram plik .so i po prostu szukam zawartości ciągu (wiem jak to się zaczyna), mogę go znaleźć pod adresem 0x2e0b4. Pod tym adresem jest tam, zero zakończone i zgodnie z oczekiwaniami. (Używam tej metody teraz.)
Nie jestem informatykiem. Czy ktoś mógłby mi wyjaśnić, dlaczego wartość symbolu przedstawiona przez nm jest nieprawidłowa, lub inaczej, jaka jest wartość symbolu, jeśli nie jest to adres symbolu?
(Nawiasem mówiąc pracuję na komputerze Mac z OSX 10.7)
To świetny pomysł. Próbuję tego teraz. Jest tylko jeden problem: biblioteki, które testuję, mają raczej długi łańcuch zależności od innych bibliotek. Jeśli spróbuję wczytać dlopena, otrzymam błędy Nie znaleziono symbolu. Łańcuch wersji, który mnie interesuje, oczywiście nie ma zależności. Jak utworzyć zależność dl, aby ignorować zależności? – Simon
Sprawdziłem. Działa to świetnie, jeśli wszystkie obciążenia są załadowane, co jest jednym z moich dwóch przypadków użycia. Dzięki za pomysł. – Simon