2016-05-17 18 views
5

Tôi tự hỏi nếu các tùy chọn liên kết gcc (ví dụ: -Wl, tùy chọn) có thể thay đổi hướng dẫn lắp ráp trong tệp thực thi được biên dịch, điều này xảy ra nếu bạn sử dụng một số tùy chọn tối ưu hóa gcc? Sự khác nhau giữa việc sử dụng tùy chọn trình liên kết và không sử dụng nó có được nhìn thấy khi bạn so sánh các tệp nhị phân đã biên dịch (ví dụ: so sánh chữ ký) không?Các tùy chọn liên kết gcc có thể thay đổi hướng dẫn lắp ráp trong nhị phân đã biên dịch không?

CẬP NHẬT

Để được chính xác hơn tôi muốn tìm hiểu xem FLIRT chữ ký thay đổi khi tôi sử dụng tùy chọn liên kết nhất định trong quá trình biên dịch. Những chữ ký này chỉ sử dụng các hàm thư viện để tạo chữ ký.

+1

Xem ví dụ: '--wrap'. – Phillip

+0

@Phillip bạn có thể giải thích chính xác hơn không? – Maximilian

+0

Trang người đàn ông có chi tiết về tùy chọn; nó có thể được sử dụng để ghi đè các ký hiệu, trong đó, ít nhất là đối với các tệp đối tượng C, cũng có thể thay đổi chữ ký của hàm. – Phillip

Trả lời

4

Đối với một số tùy chọn mối liên kết, những thay đổi có thể được nhìn thấy trong nhị phân được sản xuất, ví dụ:

  • Tùy chọn để thoát khỏi/giữ những biểu tượng gỡ lỗi (--strip-all, --strip-debug, --discard-all)
  • Tùy chọn để thoát khỏi/giữ các phần không sử dụng, ví dụ một phần chứa hàm không bao giờ được tham chiếu trong các phần khác. Các phần này có thể dễ dàng bị xóa. Hoặc để giữ các phần/nội dung di dời. (--as-needed, --emit-relocs)
  • Tùy chọn để bao gồm một thư viện tĩnh hoặc một số khác tương thích (Ví dụ phiên bản thư viện x.0 vs phiên bản x.1)
  • Thứ tự mà các đối tượng và các thư viện tĩnh được đặt trên dòng lệnh. Ví dụ: ld -o foo a.obj b.obj c.objld -o foo a.obj c.obj b.obj sẽ có thể là tạo nhị phân khác nếu cuộc gọi từ một đến một hàm trong c được giải quyết (bù cho mã từ c.obj và do đó địa chỉ của hàm trong c sẽ có thể là khác nhau)

Nhưng ngay cả sau khi liên kết, chữ ký của nhị phân có thể thay đổi. Ví dụ trong Linux, khi bạn tối ưu hóa thời gian khởi động nhị phân bằng cách chạy prelink

+0

thực sự tôi chỉ quan tâm đến những thay đổi trong nhị phân ở mức chức năng. Nếu các biểu tượng gỡ lỗi cụ thể được sửa đổi, điều này sẽ không thay đổi mã assembly của các hàm. Bạn có thể tưởng tượng một kịch bản mà mã lắp ráp trên cơ sở chức năng thay đổi bằng cách sử dụng các tùy chọn liên kết? – Maximilian

+3

Có, các cuộc gọi đến các đối tượng khác có thể giải quyết các vị trí/địa chỉ khác nhau tùy theo thứ tự của chúng hoặc thứ tự của các thư viện tĩnh hoặc các phiên bản khác của thư viện. – Elijan9

+0

nhưng chức năng trong thư viện tĩnh sẽ vẫn bị ảnh hưởng, phải không? – Maximilian

1

Có, bạn sẽ thấy một kiểm tra khác nhau trên hai tệp nhị phân được liên kết với các tùy chọn trình liên kết khác nhau, trừ khi bạn chỉ định mặc định tùy chọn hoặc tùy chọn không thay đổi nhị phân (-print-map).

Bạn đang cố gắng tìm ra chính xác? Có vẻ như bạn đang gặp sự cố khi bạn chỉ định các tùy chọn liên kết nhất định và bạn đang cố gắng tìm ra lý do. Hãy cho chúng tôi biết thêm và có thể chúng tôi có thể hỗ trợ tốt hơn.

+0

xem cập nhật ở trên – Maximilian

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