2012-08-24 69 views
36

Có cách nào để xem trình biên dịch và cờ nào được sử dụng để tạo tệp thực thi trong * nix? Tôi có một phiên bản cũ của mã của tôi được biên soạn và tôi muốn xem liệu nó đã được biên dịch có hay không có tối ưu hóa. Google không phải là quá hữu ích, nhưng tôi không chắc chắn tôi đang sử dụng các từ khóa chính xác.Nhận các tùy chọn trình biên dịch từ tệp thực thi đã biên dịch?

+1

Có vẻ như 'frecord-gcc-switches' là mẹo cho gcc, nhưng có một lá cờ tương tự cho Intel (icc) không? – Mosby

+0

là có cách nào để làm điều đó mà không cần frecord-gcc-switch? ví dụ. nhìn vào mức độ vòng lặp unroling và như vậy trên – OneSolitaryNoob

Trả lời

48

gcc có một lựa chọn -frecord-gcc-switches cho rằng:

-frecord-gcc-switches 
     This switch causes the command line that was used to invoke the compiler to 
     be recorded into the object file that is being created. This switch is only 
     implemented on some targets and the exact format of the recording is target 
     and binary file format dependent, but it usually takes the form of a section 
     containing ASCII text. 

Sau đó, thực thi ELF sẽ chứa .GCC.command.line phần với thông tin đó.

$ gcc -O2 -frecord-gcc-switches a.c 
$ readelf -p .GCC.command.line a.out 

String dump of section '.GCC.command.line': 
    [  0] a.c 
    [  4] -mtune=generic 
    [ 13] -march=x86-64 
    [ 21] -O2 
    [ 25] -frecord-gcc-switches 

Tất nhiên, nó sẽ không hoạt động cho các tệp thi hành được biên dịch mà không có tùy chọn đó.


Đối với trường hợp đơn giản của việc tối ưu, bạn có thể hãy thử sử dụng một trình gỡ lỗi nếu file đã được biên soạn với thông tin gỡ lỗi. Nếu bạn bước qua nó một chút, bạn có thể nhận thấy rằng một số biến được 'tối ưu hóa'. Điều đó cho thấy rằng tối ưu hóa đã diễn ra.

+0

+1 cho chính mình. – Johan

+0

'-frecord-gcc-switches' gần như là những gì tôi cần. Tuy nhiên phần kết quả có '-fpreprocessed' và tất cả các định nghĩa macro' -D' không còn ở đó nữa. Làm thế nào tôi có thể nhận được chúng? (Tôi đang xây dựng một mô-đun hạt nhân.) –

3

Đây là thứ cần hỗ trợ trình biên dịch. Bạn không đề cập đến trình biên dịch bạn đang sử dụng nhưng vì bạn đã gắn thẻ câu hỏi của mình linux Tôi cho rằng bạn đang sử dụng gcc - không mặc định tính năng bạn đang hỏi (nhưng -frecord-gcc-switches là tùy chọn để thực hiện điều này).

Nếu bạn muốn kiểm tra tệp nhị phân của mình, lệnh strings sẽ hiển thị cho bạn mọi thứ dường như là chuỗi ký tự có thể đọc được trong tệp.

1

Tôi rất nghi ngờ nó có thể:

int main() 
{ 
} 

Khi biên soạn với:

gcc -O3 -ffast-math -g main.c -o main 

Không ai trong số các thông số có thể được tìm thấy trong các đối tượng được tạo ra:

strings main | grep -O3 
(no output) 
+0

Mặc dù ...Tôi đã làm một so sánh giữa thực thi được tạo ra cho một chương trình "không có gì" tương tự có và không có tối ưu hóa, và chúng hiển thị một số khác biệt xung quanh ... –

+0

Ok, kiểm tra với 'readelf' cho thấy rằng nó chỉ là một sự sắp xếp khác nhau của chức năng, không có gì rõ ràng la hét "này đã được biên dịch với' -O3' ". –

11

Nếu bạn biên dịch với cờ -frecord-gcc-switches, sau đó các tùy chọn trình biên dịch dòng lệnh sẽ được viết bằng nhị phân trong th phần ghi chú. See also the docs.

+0

Cách tốt nhất để kiểm tra nhị phân là gì? hexeditor? binutils? – Johan

+2

@Johan: 'readelf'. –

+0

chuỗi đã không làm việc cho tôi, readelf đã làm việc. – Johan

1

Nếu bạn vẫn có trình biên dịch (cùng phiên bản) bạn đã sử dụng và chỉ có một cờ bạn không chắc chắn, bạn có thể thử biên dịch lại mã, một lần và không có cờ. Sau đó, bạn có thể so sánh các tập tin thực thi. Cái cũ của bạn phải giống hệt nhau, hoặc rất giống với một cái mới.

5

Tùy chọn khác là -grecord-gcc-swtiches (lưu ý, không phải -f nhưng -g). Theo tài liệu gcc, nó sẽ đặt cờ vào thông tin gỡ lỗi lùn. Và có vẻ như nó được kích hoạt theo mặc định kể từ gcc 4.8.

Tôi đã tìm thấy chương trình dwarfdump hữu ích để trích xuất các cflags đó. Lưu ý, chương trình chuỗi không nhìn thấy chúng. Hình như thông tin lùn được nén.

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