Gần đây tôi đang xây dựng một thư viện được chia sẻ nhất định (ELF) nhắm mục tiêu kiến trúc x86-64, như thế này:khác biệt trong mã vị trí độc lập: x86 vs x86-64
g++ -o binary.so -shared --no-undefined ... -lfoo -lbar
này thất bại với các lỗi sau:
relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
Tất nhiên, điều đó có nghĩa là tôi cần phải xây dựng lại dưới dạng mã độc lập với vị trí, vì vậy nó phù hợp để liên kết vào thư viện được chia sẻ.
Nhưng điều này hoạt động hoàn toàn tốt trên x86 với chính xác cùng một đối số xây dựng. Vì vậy, câu hỏi là, làm thế nào là di dời trên x86 khác nhau từ x86-64 và tại sao tôi không cần phải biên dịch với -fPIC
trên trước đây?
Tôi chưa bao giờ hiểu điều này. Nếu trình biên dịch có thể cho bạn biết chính xác tùy chọn nào sẽ sử dụng tự động, tại sao nó yêu cầu bạn nói từ ảo thuật để làm cho nó hoạt động chính xác? Grrr .. –
@Billy Oneal, Bây giờ tôi tin rằng đó là trường hợp trừu tượng bị rò rỉ. Chúng khác nhau về cách chúng tải dữ liệu toàn cầu, ảnh hưởng đến việc liệu PIC có cần thiết hay không. –
Tôi hiểu sự cần thiết cho sự khác biệt. Những gì tôi không hiểu là lý do tại sao bạn cần phải cung cấp cho trình biên dịch một chuyển đổi để làm cho nó làm điều đó. –