2014-05-14 16 views
5

Tôi đang cố gắng liên kết Andi Kleen's glibc implementation để bật tính năng khóa-elision cho chương trình có pthread. tôi liên kết chương trình của tôi như sau:Liên kết với glibc không mặc định

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 

Chừng nào tôi không sử dụng bất kỳ thành phần của libstdC++, tất cả mọi thứ hoạt động tốt.

Nhưng ngay sau đó, ví dụ: std::vector được tham chiếu, liên kết động không thể tìm thấy libstdC++. So.6 (error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory).

Để giải quyết lỗi này, tôi đã cố gắng cung cấp tùy chỉnh cũng như glibc chuẩn với -Wl,--rpath=/path/glibc-elision/build/lib;/usr/lib/x86_64-linux-gnu/libstdc++.so.6. Đây không phải là cuộc gọi chính xác nhưng ý tưởng là bằng cách nào đó cung cấp cả hai thư viện.

Vì vậy, câu hỏi là:

Làm thế nào để liên kết một chương trình chống lại các thành phần khác nhau của hai glibcs?

Tôi đang làm việc trên Ubuntu 13.10 với gcc (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1.

+2

Điều này nghe giống như ld-linux-x86-64.so.2 mới của bạn không thể tìm thấy thời gian chạy C++ ... Như kiểm tra nhanh, bạn có thể thử đặt biến môi trường 'LD_LIBRARY_PATH' thành'/usr/lib64'. – Nemo

+0

Có vẻ như đó là cách tiếp cận đúng: thay vì lỗi 'libstdC++. So.6', tôi nhận được lỗi rằng' libgcc_s.so.1' không thể tìm thấy (cho biết 'libstdC++. So.6' là tìm). – mschrimpf

Trả lời

3

Nhờ Nemo's comment, sự cố có thể được giải quyết bằng cách thêm thời gian chạy C++ vào đường dẫn. Trong trường hợp của tôi, đó là

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

Các đường dẫn có thể được thiết lập bằng cách sử dụng export LD_LIBRARY_PATH=/your/path là tốt.

Nó cũng chỉ ra rằng tôi đã sử dụng sai ; thay vì : để nối thêm đường dẫn trong bài đăng gốc.

Các vấn đề liên quan