2015-07-10 14 views
15

Tôi đọc this đăng trên PIC và có vẻ như nó luôn luôn là tốt để sử dụng PIC (bất cứ khi nào nó là exe/tĩnh/chia sẻ llibrary).Tại sao không phải lúc nào cũng sử dụng fpic (Mã độc lập vị trí)?

Vậy các nhược điểm là gì?
Có các ví dụ cụ thể khi không sử dụng PIC không?

+1

PIC thường không thể được sử dụng trong Windows vì địa chỉ DLL được cố định trong thời gian tải. Hơn nữa trong x86 PIC là không hiệu quả như trong x86_64 –

Trả lời

6

Câu trả lời được chấp nhận trong câu hỏi được liên kết rất đơn giản và chỉ hiển thị một điều khác biệt giữa mã PIC và không phải PIC, tạo ra các bước nhảy có liên quan thay vì tuyệt đối.

Khi bạn tạo mã PIC, không chỉ mã số độc lập, đó cũng là dữ liệu. Và không phải tất cả mã hoặc dữ liệu đều có thể được giải quyết đơn giản bằng cách sử dụng các offset tương đối, nó phải được giải quyết tại thời gian tải (khi thư viện/chương trình được nạp vào bộ nhớ) hoặc thậm chí trong thời gian chạy.

Ngoài ra, bằng cách sử dụng địa chỉ tương đối có nghĩa là CPU phải dịch các dời gốc tương đối thành địa chỉ tuyệt đối, thay vì nó được thực hiện bởi trình biên dịch.

Trên hệ thống có bộ nhớ ảo thường không cần phải tốn thời gian tải hoặc chạy trên các độ phân giải địa chỉ tương đối này khi trình biên dịch có thể thực hiện một lần và cho tất cả.

+0

Có tình huống sử dụng -fpic, hoặc không sử dụng fpic rằng chương trình sẽ sụp đổ? (không trình biên dịch tạo mã máy phù hợp cho cả hai trường hợp?) – Azil

+0

@Azil: Nó tạo ra mã thích hợp. Nếu bạn đang xây dựng một thư viện được chia sẻ (.so, .dll), bạn * phải * sử dụng PIC, nó không hoạt động theo cách khác. Một số máy như Amiga ví dụ đã có * tất cả * mã là PIC do kiến ​​trúc của họ, nhưng sau đó những người đang chạy trên * thực * CPU (68k) mà không bị nó. ;-) – DevSolar

+0

Vì vậy, xây dựng như vậy (dll) mà không có PIC - luôn luôn cung cấp cho lỗi biên dịch? – Azil

0

Trên một số kiến ​​trúc, bao gồm x86, -fPIC tạo ra nhiều mã số tồi tệ hơn (tức là cuộc gọi chức năng) cho tải/lưu trữ dữ liệu. Trong khi điều này là chấp nhận được cho các thư viện, nó là không mong muốn cho thực thi.

Một trong những điểm bán hàng chính của tập lệnh amd64 (và cũng là gnu-x32 ABI gần đây) là bổ sung hướng dẫn "tải/lưu trữ máy tính", giải quyết vấn đề về hiệu quả.

Lưu ý rằng các hệ thống được cố định thường là làm bật -fPIE cho tất cả các tệp thực thi, vì nó cho phép ngẫu nhiên bố cục không gian địa chỉ.

+0

Nó không thể so sánh với một cuộc gọi chức năng, nhưng nó chiếm một thanh ghi. – DevSolar

+0

@DevSolar uh, nó chắc chắn đòi hỏi một cuộc gọi chức năng (mặc dù nó có thể cache nó trong một đăng ký sau lần đầu tiên rõ ràng). Nó xuất hiện trong quá trình tháo gỡ với các tên như '__x86.get_pc_thunk.cx', rõ ràng là thanh ghi thay đổi tùy thuộc vào những gì hiện đang được sử dụng. – o11c

+1

Ah ... chúng tôi có ý giống nhau. Các "chức năng gọi" là một thủ thuật để có được địa chỉ của bảng bù đắp vào một đăng ký. Giữ cho nó được lưu trong bộ nhớ cache chiếm một thanh ghi (như tôi đã nói), không lưu vào bộ nhớ đệm nó làm cho truy cập dữ liệu yêu cầu một cuộc gọi hàm (như bạn đã nói). Cần lưu ý rằng đây là một trong những "bit xấu xí" điển hình của kiến ​​trúc x86; hầu hết nếu không phải tất cả các họ CPU khác đều cho phép liên hệ với máy tính thích hợp trở lại vào những năm 1980 ... – DevSolar

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