2011-12-03 41 views
8

Tôi cần liên kết động thư viện mà tôi đã tạo. Tôi không chắc chắn vấn đề là gì. Tất cả đều biên dịch đúng, nhưng tôi luôn luôn bắt handle như con trỏ NULL:Thư viện libdl và thư viện được liên kết động thích hợp

void *handle; 
char *error; 
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY); 
//same error comes up with full path as well as './hw11...' 
if(!handle){ 
    error = dlerror(); 
    printf("%s\n", error); 
    printf("Error loading library.\n"); 
    exit(1); 
} 

tôi không thể có được thông qua lỗi này và tôi không chắc chắn điều gì có thể là sai lầm. Tôi khá chắc chắn tôi đã biên dịch mọi thứ một cách chính xác. Dưới đây là các bước biên soạn tôi đã sử dụng:

gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so 
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4 

Tôi nhận được một lỗi mà đọc

chỉ ET_DYN và ET_EXEC có thể được nạp.

Trả lời

14

Khi xây dựng hw11-lib-michaelSchilling.so, bạn dường như không nói gcc rằng bạn muốn một đối tượng được chia sẻ (.so trong tên không đủ).

Với -c, nó tạo một tệp đối tượng (không phải là được chia sẻ đối tượng) và gọi số michaelSchilling.so. Trình liên kết thậm chí không được gọi.

Tháo -c từ dòng lệnh gcc và thêm -shared:

gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so 
+0

Cùng với '-rdynamic'? Chỉ cần thử nó với cả hai và chỉ với '-shared', nhưng tôi đã nhận được lỗi tương tự. –

+0

@MichaelSchilling: Tôi không nghĩ rằng '-rdynamic' có liên quan gì đến vấn đề này, vì vậy bạn có thể giữ nó trong trường hợp cần mã của bạn. – NPE

+0

@MichaelSchilling: Bạn đã xóa '-c' chưa? – NPE

0

Có phải là hw11-lib-michaelSchilling.so trong thư mục gốc tuyệt đối của hệ thống tệp của bạn không? Bạn đang tuyên bố nó là bằng cách dẫn đầu một dấu gạch chéo vào nó ... nhưng tôi nghi ngờ nó không phải.

Trong xử lý lỗi của bạn, hãy bao gồm kết quả của dlerror() trong nội dung bạn in, để tìm nguyên nhân gây ra lỗi.

+0

hw11 -lib-michaelSchilling.so: không thể mở tệp đối tượng được chia sẻ: Không có tệp hoặc thư mục nào như vậy Đó là lỗi tôi nhận được, nhưng cùng thư mục với chương trình tôi đang cố chạy. Tôi cũng đã xóa dấu gạch chéo. –

+0

Hãy thử cung cấp đường dẫn tuyệt đối đầy đủ cho đối tượng được chia sẻ để xem điều đó có hữu ích không. – mah

+0

Tôi đã làm, và tôi nhận 'chỉ ET_DYN và ET_EXEC có thể được tải.' –

1

Dấu gạch chéo (/) làm ký tự đầu tiên cho biết tên đường dẫn là tuyệt đối (liên quan đến thư mục gốc), không liên quan đến thư mục làm việc hiện tại và chắc chắn không liên quan đến vị trí của tệp nhị phân. Bạn sẽ cần phải xác định đường dẫn đầy đủ bằng cách tìm ra vị trí của nhị phân (mà không phải là một vấn đề dễ dàng trong chính nó) hoặc bạn có thể sử dụng $ORIGIN với dlopen (nó hoạt động với rpath nhưng tôi không chắc chắn liệu nó hoạt động với dlopen).

+0

Còn khoảng thời gian trước đường dẫn? ('. /') –

+0

Điều đó làm cho nó liên quan đến thư mục làm việc hiện tại, không phải là vị trí của chương trình nhị phân của bạn. –

0
gcc -fPIC -shared -rdynamic library.c -o library.o 

công trình đối với tôi trên Linux khi biên soạn các thư viện cho mã mở nó, bạn cần -ldl

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