2011-10-25 40 views
7

Ồ, tôi là một newbie trong GCC và MAC và Makefile. Hôm nay tôi có ý định xây dựng một lib động sử dụng MAC OS X và GCC 4.4.2, nhưng khi liên kết các tập tin .o, trình biên dịch phàn nàn như thế này:Biểu tượng "___emutls_get_address" là gì?

Undefined symbols: 
    "___emutls_get_address", referenced from: 
     _malloc in michael.o 
     _malloc in michael.o 
ld: symbol(s) not found 

Tôi googled thông tin này, nhưng tôi không thể hiểu kết quả tốt, tôi tự hỏi ý nghĩa của biểu tượng là gì và tại sao nhiều chương trình có lỗi liên kết này. Tôi cũng tự hỏi là những gì các nguyên nhân có thể cho lỗi này, lệnh liên kết là:

g++ -Dx86 -D_GNU_SOURCE -D_REENTRANT -Wall -m32 \ 
    -fno-strict-aliasing -fno-pic -O3 -ggdb \ 
    michael.o malloc_new.o -o libmichael.so \ 
    -lpthread -lm -lstdc++ -shared 
+0

Bạn không cần phải liên kết với '-lstdC++' một cách rõ ràng, g ++ nên chọn đúng chính nó. Hãy thử xóa điều đó. – Mat

Trả lời

5

Biểu tượng này là một phần của TLS (thread-địa phương lưu trữ) thi đua bằng gcc cho Mac OS X. Có một số lỗi trong gcc bugzilla về vấn đề này, ví dụ như: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39888

Sử dụng chủ đề lưu trữ cục bộ (ví dụ như biến OpenMP ThreadPrivate) trên Darwin đòi hỏi tay liên kết đến emutls TLS, thông qua một trong hai -lgcc_s.so.1 hoặc -lgcc_eh

Xem chủ đề: http://gcc.gnu.org/ml/gcc/2008-12/msg00145.html http://gcc.gnu.org/ml/gcc/2008-12/msg00107.html

Từ các chủ đề trên, điều này rõ ràng là một mớ hỗn độn. Tuy nhiên, vì tôi chỉ là bit bởi điều này, tôi hy vọng sẽ hữu ích khi có một lỗi theo dõi vấn đề.

...

TLS hoạt động tốt nếu tôi tự liên kết đến gcc_s.so.1 hoặc gcc_eh như đã đề cập ở trên.

Vì vậy, một trong các giải pháp có thể là thêm -lgcc_s.so.1 hoặc -lgcc_eh tùy chọn để liên kết bước. Và khác là cập nhật gcc của bạn, bởi vì đây là lỗi của gcc.

+0

Tôi đã thử hai thư viện này và không tìm thấy thư viện đầu tiên. Sau khi sử dụng thứ hai, biểu tượng emutls bây giờ có thể được tìm thấy, nhưng GCC tiếp tục phàn nàn rằng "địa chỉ tuyệt đối (có lẽ -mdynamic-no-pic) được sử dụng trong _DescRetire từ michael.o không được phép trong hình ảnh có thể trượt được. 'để kích hoạt các di tích văn bản ", tôi vẫn chưa có ý tưởng về điều đó. – JustQieTry

+1

JustQieTry, tôi nghĩ rằng đây là tùy chọn '-fno-pic'. cố gắng biên dịch lại dự án của bạn mà không có tùy chọn này. Bạn đang cố gắng xây dựng thư viện .so và bất kỳ thư viện động nào đều phải được biên dịch ở chế độ -fpic. – osgx

+0

Nếu -fpic được bật, có một vấn đề khác, nó phàn nàn rằng "không thể tìm thấy một đăng ký trong lớp 'BREG' trong khi tải lại 'asm'", tôi googled cho điều đó và thấy rằng cho mac, -fpic là trên bởi mặc định, vì vậy tôi chuyển nó sang tắt ....... là sai? – JustQieTry

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