2010-08-23 46 views
8

Bối cảnh: Tôi có thể tạo thư viện đối tượng dùng chung được liên kết với một thư viện tĩnh mà không gặp bất kỳ sự cố nào trên Linux 32 bit. Khi tôi thử cùng một bản dựng trên linux 64bit, tôi thấy lỗi trình liên kết này:linux g ++ liên kết 64 bit mã thư viện chia sẻ với thư viện tĩnh

  • relocation R_X86_64_32S với 'một biểu tượng cục bộ' không thể được sử dụng khi tạo đối tượng dùng chung; biên dịch lại với -fPIC

Lỗi này khá phổ biến trên web. Giải pháp là biên dịch thư viện liên kết tĩnh với mã độc lập vị trí (-fPIC).

Điều tôi không hiểu là lý do tại sao điều này không bắt buộc đối với bản dựng 32 bit. bất cứ ai có thể giúp đỡ?

Trả lời

3

Ok câu trả lời là mô tả chi tiết ở đây: http://www.technovelty.org/code/c/amd64-pic.html.

Ý chính cơ bản của giải thích là kiến ​​trúc i386 ngầm ẩn diếm con trỏ khung cho từng chức năng (được giải thích ở đoạn cuối cùng của trang được liên kết). Quá trình này phát sinh thêm một số chi phí bổ sung như vậy trong các kiến ​​trúc 64-bit mới, chi phí hội nghị dereferencing này đã được loại bỏ như là một tối ưu hóa.

Hậu quả của việc tối ưu hóa này từ góc độ liên kết là trừ khi mã 64 bit được biên dịch rõ ràng dưới dạng mã độc lập vị trí, nó sẽ tạo mã được mã hóa cứng với bù cho ngữ cảnh thực thi của nó.

Đây là giải thích không hoàn hảo về nội dung trong trang được liên kết nhưng nó đủ cho mục đích của tôi.

+0

Cũng liên quan đến http: //stackoverflow.com/questions/3146744/difference-in-position-independent-code-x86-vs-x86-64 –

4

"Mã độc lập vị trí" luôn được yêu cầu nếu mô-đun đối tượng của bạn sẽ được sử dụng trong thư viện được chia sẻ. Nó phụ thuộc vào nền tảng cao, và nó phải chịu một số chi phí.

Lý do bạn phải chỉ định rõ ràng trên amd64, nhưng không phải là x386, đơn giản là nó xảy ra là mặc định cho x86, nhưng không phải là amd64.

Lưu ý, quá, sự khác biệt giữa "-fpic" và "-fPIC":

-fpic 
    Generate position-independent code (PIC) suitable for use in a 
    shared library, if supported for the target machine. Such code 
    accesses all constant addresses through a global offset table 
    (GOT). The dynamic loader resolves the GOT entries when the pro- 
    gram starts (the dynamic loader is not part of GCC; it is part 
    of the operating system). If the GOT size for the linked execu- 
    table exceeds a machine-specific maximum size, you get an error 
    message from the linker indicating that -fpic does not work; in 
    that case, recompile with -fPIC instead. (These maximums are 8k 
    on the SPARC and 32k on the m68k and RS/6000. The 386 has no 
    such limit.) 

    Position-independent code requires special support, and there 
    fore works only on certain machines. For the 386, GCC supports 
    PIC for System V but not for the Sun 386i. Code generated for 
    the IBM RS/6000 is always position-independent. 

    When this flag is set, the macros __pic__ and __PIC__ are defined to 1. 

-fPIC 
    If supported for the target machine, emit position-independent 
    code, suitable for dynamic linking and avoiding any limit on the 
    size of the global offset table. This option makes a difference 
    on the m68k, PowerPC and SPARC. 

    Position-independent code requires special support, and therefore 
    works only on certain machines. 

    When this flag is set, the macros __pic__ and __PIC__ are defined to 2. 
+0

Thông tin tốt nhưng tôi không thể tìm thấy bất cứ điều gì để hỗ trợ khẳng định của bạn rằng mã i386 là fPIC theo mặc định. Trong thực tế, khi tôi biên dịch một số mã như fPIC và so sánh nó với mã đối tượng thông thường, có sự khác biệt đáng kể giữa các tệp đối tượng kết quả –

+0

Hi - Bạn chính xác. Mã i386 là * relocatable * theo mặc định, nhưng không * vị trí độc lập *. Liên kết bạn đã trích dẫn bên dưới giải thích tình huống đẹp mắt: http://www.technovelty.org/code/c/amd64-pic.html Trớ trêu thay, tôi tìm thấy liên kết này bởi Googling "relocatable vs position independent", mà dẫn tôi đến chủ đề này: http://stackoverflow.com/questions/3146744/difference-in-position-independent-code-x86-vs-x86-64 của bạn .. PSM – paulsm4

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