2014-05-14 29 views
5

Próbuję połączyć Andi Kleen's glibc implementation, aby włączyć blokadę dla programu z pthreads. połączyć mój program w następujący sposób:Łącze z innym niż domyślnym glibc

g++ \ 
-Wl,--rpath=/path/glibc-elision/build/lib \ 
-Wl,--dynamic-linker=/path/glibc-elision/build/lib/ld-linux-x86-64.so.2 \ 
-o program program.o \ 
-fgnu-tm -mrtm -pthread \ 
-Wl,--no-as-needed --enable-lock-elision=yes 

Dopóki nie używam żadnych składników libstdC++, wszystko działa bez zarzutu.

Ale tak szybko, jak np. std::vector jest przywoływany, dynamiczny linker nie może znaleźć libstdC++. So.6 (error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory).

Aby rozwiązać ten problem, próbowałem podać zarówno niestandardowy, jak i standardowy glibc z -Wl,--rpath=/path/glibc-elision/build/lib;/usr/lib/x86_64-linux-gnu/libstdc++.so.6. To nie jest poprawne połączenie, ale chodzi o to, aby zapewnić obie biblioteki.

Więc pytanie brzmi:

Jak połączyć program przed różnymi składnikami dwóch glibcs?

Pracuję nad Ubuntu 13.10 z gcc (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1.

+2

To brzmi jak twój nowy ld-linux-x86-64.so.2 nie może znaleźć środowiska uruchomieniowego C++ ... Jako szybki test możesz spróbować ustawić zmienną środowiskową 'LD_LIBRARY_PATH' na'/usr/lib64'. – Nemo

+0

Tak, wydaje się, że to właściwe podejście: zamiast błędu 'libstdC++. So.6' pojawia się błąd, że' libgcc_s.so.1' nie może zostać znaleziony (co oznacza, że ​​'libstdC++. So.6' był uznany). – mschrimpf

Odpowiedz

3

Dzięki Nemo's comment problem można rozwiązać, dołączając środowiska wykonawcze C++ do ścieżki rpath. W moim przypadku, to

-Wl,--rpath=/path/glibc-elision/build/lib:/usr/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu 

Ścieżki można ustawić za pomocą export LD_LIBRARY_PATH=/your/path również.

Okazuje się również, że zamiast fałszywie używać ; zamiast : dołączam ścieżki w oryginalnym poście.