2012-04-20 41 views
11

Tôi muốn biết việc sử dụng tùy chọn -mpreferred-stack-boundary trong quá trình biên dịch trong trình biên dịch GNU là gì. Tôi đã kiểm tra tài liệu nhưng lời giải thích bị mất trên tôi. Ai đó có thể vui lòng giải thích nó.tùy chọn gcc -mpreferred-stack-boundary

Trả lời

9

Tôi muốn biết việc sử dụng tùy chọn -mpreferred-stack-boundary trong quá trình biên dịch trong trình gỡ lỗi GNU là gì.

Tùy chọn có hoàn toàn không có gì để thực hiện với trình gỡ lỗi.

Nó ảnh hưởng đến mã được tạo trong tệp nhị phân của bạn. Theo mặc định, GCC sẽ sắp xếp mọi thứ để mọi hàm, ngay khi nhập, có con trỏ ngăn xếp của nó được căn chỉnh trên ranh giới 16 byte (điều này có thể quan trọng nếu bạn có biến cục bộ và bật hướng dẫn sse2).

Nếu bạn thay đổi mặc định thành ví dụ: -mpreferred-stack-boundary=2, sau đó GCC sẽ căn chỉnh con trỏ ngăn xếp trên ranh giới 4 byte. Điều này sẽ giảm yêu cầu ngăn xếp của các thói quen của bạn, nhưng sẽ sụp đổ nếu mã của bạn (hoặc mã bạn gọi) không sử dụng sse2, vì vậy nói chung là không an toàn.

+2

+1 Điều đáng nói đến là kích thước ranh giới thực tế là 2^PSB. Nếu bạn đặt tham số này thành 2, bạn sẽ nhận được kích thước ranh giới là 2^2 = 4. Nếu bạn đặt nó thành 4, bạn sẽ nhận được kích thước ranh giới là 2^4 = 16. –

0

Nó phải làm với các ranh giới byte mà chương trình của bạn sử dụng khi nó được đặt ra trong bộ nhớ.

Ranh giới ngăn xếp = 2 là đảm bảo rằng ngăn xếp được thiết lập thành gia số có kích thước dword, điều này ngăn máy của bạn tối ưu hóa ngăn xếp.

Nếu bạn kiểm tra:

`info gcc and search by entering "/mpreferred-stack-boundary"` it says: 
>-mpreferred-stack-boundary=num 
> 

Cố gắng để giữ chồng ranh giới liên kết đến một 2 nâng lên ranh giới num byte. Nếu -mpreferred-stack-ranh giới không được chỉ định, mặc định là 4 (16 byte hoặc 128 bit).

Ranh giới ngăn xếp mặc định là 4 giống nhau cho cả hai máy Intel 386 và AMD x86-64.

Khi tôi cố gắng sử dụng "m được ưu tiên trên stack-ranh giới = 2" tùy chọn trên 64-bit máy linux biên soạn của tôi thất bại với lỗi

"-mpreffered-stack-ranh giới = 2 là không nằm trong khoảng từ 4 đến 12 ".

Điều này là do chiều rộng của trường địa chỉ được tăng từ 4 byte lên 8 byte trong máy 64 bit. Vì vậy, nó không thể viết các khối riêng lẻ tại một ranh giới ngăn xếp = 2 vì 2^2 = 4 byte. Tuy nhiên, thú vị, một ranh giới ngăn xếp của 3 vẫn trả về một lỗi trên cả hai máy 32 và 64 bit, mà sẽ là một ranh giới 8 byte.

Tôi không thể bao gồm liên kết vì tôi không có 10 danh tiếng ... nhưng tìm kiếm biến nội dung trở nên khá dễ dàng Theo như tôi có thể nói đó là tính năng bảo mật vì 8 byte dễ bị lệch giá ... không nghi ngờ ai đó biết rõ hơn, hoặc có nhiều chi tiết hơn.

How the stack got misaligned Says:

Để đảm bảo sự liên kết hợp các giá trị này trên stack, ngăn xếp ranh giới phải được như thẳng hàng như yêu cầu của bất kỳ giá trị được lưu trữ trên stack. Hơn nữa, mọi chức năng phải được tạo ra sao cho nó giữ cho chồng xếp hàng. Do đó, việc gọi một hàm được biên dịch với một ranh giới ngăn xếp ưu tiên cao hơn từ một hàm được biên dịch với một ranh giới ngăn xếp được ưu tiên thấp hơn sẽ rất có khả năng làm sai lệch ngăn xếp. Chúng tôi khuyên rằng các thư viện sử dụng gọi lại luôn sử dụng cài đặt mặc định.

Căn chỉnh bổ sung này tiêu thụ thêm không gian ngăn xếp và thường tăng kích thước mã. Mã nhạy cảm với việc sử dụng không gian ngăn xếp, chẳng hạn như các hệ thống nhúng và các hạt hệ điều hành, có thể muốn giảm sự liên kết ưu tiên thành -mpreferred-stack-boundary = 2.

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