2010-10-29 36 views
10

Trên máy chủ lưu trữ 64 bit Tôi đang cố gắng xây dựng thư viện được chia sẻ với tùy chọn -m32. Các thư viện này có thể được liên kết với các thư viện 64 bit thông thường không?Cờ GCC -32:/usr/bin/ld: bỏ qua không tương thích

Tôi đang làm một cái gì đó như thế này:

g++ -m32 -shared source.cpp -l 64_bit_library.so -o 32_bit_library.so 

và nhận được thông báo lỗi như thế này:

/usr/bin/ld: skipping incompatible 64_bit_library.so 

Vì vậy, câu hỏi của tôi là: làm thế nào 64_bit_library.so32_bit_library.so nên được biên soạn trên máy chủ 64 bit, để làm cho nó có thể cho 32_bit_library.so được liên kết với 64_bit_library.so?

Trả lời

11

Không thể liên kết ứng dụng 32 bit với thư viện 64 bit và ngược lại. Vấn đề là con trỏ và các loại nói chung không thể được truyền giữa chúng. Thông thường, giải pháp thay thế là tạo ra một tiến trình con với kích thước khác và sử dụng IPC để giao tiếp với quy trình đó.

Hãy suy nghĩ về nó theo cách này: Nếu tôi có một C hàm thông thường:

extern void foo(void*); 

Nếu đó là trong một thư viện 64bit và tôi cố gắng và gọi nó là từ một thư viện 32bit nơi nào nửa kia của con trỏ đến từ?

Ngược lại nếu nó nằm trong thư viện 32 bit và tôi gọi nó từ ứng dụng 64 bit, điều gì sẽ xảy ra với nửa kia của con trỏ mà tôi sẽ phải mất để gọi?

+0

Nếu bạn thực sự cẩn thận, bạn có thể chơi một số trò chơi với typedef, mmap với cờ MAP_32BIT và phân đoạn bộ nhớ chia sẻ nhưng nó là rất nhiều rắc rối! – Flexo

+0

bạn có thể cho biết cách kiểm tra xem nó có tương thích không? sử dụng chính mình có thể? - http://rzr.online.fr/q/gcc – RzR

+0

@rzr - Cách dễ nhất để kiểm tra sẽ chỉ là sử dụng lệnh 'tệp' trên đối tượng được chia sẻ và xem liệu nó có khớp với những gì bạn đang thử không để làm với gcc. Bạn có thể làm việc nó với 'readelf -h' hoặc' objdump -x' cho ví dụ, nhưng tôi thấy đầu ra của 'file' ngắn gọn hơn. – Flexo

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