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?
Trả lời
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.
+1 cho chính mình. – Johan
'-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.) –
Đâ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.
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)
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 ... –
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' ". –
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.
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.
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.
- 1. Trình biên dịch/trình biên dịch/trình biên dịch C++
- 2. Trình biên dịch sẽ chỉ biên dịch mã có thể được thực thi?
- 3. Trình biên dịch biên dịch trong C#
- 4. biên dịch C++ thành chương trình "thực"
- 5. Hiệu suất biên dịch mã bằng biên dịch biên dịch
- 6. Các tùy chọn để biên dịch động trong Java 5
- 7. Tùy chọn Dòng lệnh cho VB6 IDE (Trình biên dịch)
- 8. CMake, chọn trình biên dịch Xcode
- 9. Phát triển iPhone - Trình biên dịch của Trình biên dịch!
- 10. Biên dịch và thực thi mã Scala khi chạy
- 11. Làm thế nào để xác định trình biên dịch nào đã được sử dụng để biên dịch một tệp thực thi?
- 12. Phân phối tệp thực thi đã biên dịch bằng gói R
- 13. Biên dịch lại với tùy chọn -fPIC, nhưng tùy chọn đã nằm trong makefile
- 14. Quá trình biên dịch
- 15. Nhúng các tệp DLL vào một tệp thực thi được biên dịch
- 16. Trình biên dịch có trình biên dịch không?
- 17. Tùy chọn trình biên dịch Java để tạo ra các tệp .exe
- 18. Nhận HTML Biên dịch từ AngularJS
- 19. Làm cách nào để áp dụng các tùy chọn trình biên dịch khác nhau cho các trình biên dịch khác nhau trong cmake?
- 20. Làm thế nào để tôi nhận được các autotools để biên dịch với trình biên dịch Intel?
- 21. Biên dịch các tệp .java bên ngoài từ trong Java
- 22. Các chương trình đã biên dịch có thực sự ở dạng nhị phân thực?
- 23. Có trình biên dịch/phiên dịch nào để thực thi mã cho php 5.3 không?
- 24. Các trường hợp kiểm thử trình biên dịch hoặc cách kiểm thử trình biên dịch
- 25. Trình biên dịch cho Haskell
- 26. Tùy chọn trình biên dịch GCC: bộ tùy chọn được bật nào là chính xác?
- 27. Trình biên dịch C++ biên dịch các tên biến như thế nào?
- 28. Cách tạo tệp GIR từ trình biên dịch Vala?
- 29. Chương trình/trình biên dịch/thông dịch viên thực sự hoạt động như thế nào?
- 30. Trình biên dịch TypeScript trở nên chậm?
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
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