2014-07-13 16 views
8

Khi tôi bật Tối ưu hóa thời gian liên kết trong GCC, các tệp nhị phân được tạo ra trở nên lớn hơn nhiều. Tôi hy vọng GCC có thể loại bỏ rất nhiều chức năng reduntant, và thực hiện tối ưu hóa khác nếu không thể, do đó, làm thế nào đến điều này làm cho sản lượng tạo ra phát triển?Tại sao 'Tối ưu hóa thời gian liên kết' dẫn đến các tệp nhị phân lớn hơn?

Compiler cờ:

-Os -c -fno-builtin -ffunction-sections -fdata-sections -flto -mcpu=cortex-m0 -mthumb 

Linker cờ:

-nostdlib -s -Xlinker --gc-sections -flto -mcpu=cortex-m0 -mthumb -T 
+0

Bạn sử dụng '-flto' chính xác như thế nào? Hiển thị các lệnh biên dịch .... Và cung cấp cho chúng tôi thêm chi tiết (phiên bản trình biên dịch). Bạn đã thử với một GCC gần đây (tức là 4.9.1 vào tháng 9 năm 2014)? –

+1

Nếu bạn sử dụng -O3 (tạo mã nhanh hơn nhưng lớn hơn), LTO cung cấp cho trình biên dịch nhiều cơ hội hơn để làm cho mã nhanh hơn (và lớn hơn). Nếu bạn sử dụng -Os (tạo các tệp nhị phân nhỏ), LTO sẽ cung cấp cho bạn nhiều cơ hội hơn để thu nhỏ kích thước mã. –

+0

@MarcGlisse Cảm ơn, nhưng tôi đã sử dụng tùy chọn -Os, nếu không firmware sẽ không phù hợp với 64kb. – Muis

Trả lời

14

Bạn có dải nhị phân sau khi kết nối với -flto (nó cần được cung cấp cả ở biên soạn và lúc link)?

BTW, thông báo thatcác cùng tối ưu hóa cờ (-flto -Os) nên được thông qua cả tại thời gian biên dịch lúc liên kết. Nếu bạn quên-như bạn đã làm- bất kỳ người trong số họ ở giai đoạn liên kết, LTO sẽ không hoạt động! (Khi sử dụng make bạn muốn CC=gcc -flto -Os không phải CFLAGS= -flto -Os).

Bạn đã quên -Os tại liên kết thời gian, trong Ngoài của -flto; chỉ đi -flto lúc liên kết mà không cần bất kỳ tối ưu hóa là sai: giai đoạn LTO sẽ "de-optimize" tại hầu hết các

Tôi biết rằng -flto thêm rất nhiều phần trong các tập tin đối tượng ELF và thực thi (những phần chứa serialization của các đại diện nội bộ của GCC như Gimple ....). Tôi đoán (nhưng chưa kiểm tra) rằng liên kết không loại bỏ chúng.

Ngoài ra, điểm chính của LTO là nội tuyến trên một số đơn vị biên dịch và điều này dự kiến ​​sẽ tăng mã. Vì vậy, có lẽ bạn không nên sử dụng LTO trong trường hợp cụ thể của bạn.

Hầu hết các chức năng dự phòng đã bị xóa (bởi trình liên kết "GC" trên các phần) ngay cả khi không có LTO.

BTW, bạn có thể sử dụng objdump hoặc readelf để tìm hiểu.

+0

Có, tôi đã sử dụng tùy chọn '-s' của trình liên kết (Bỏ qua tất cả thông tin gỡ lỗi). Phần vững của tôi thường phù hợp với 64 kb, nhưng với '-ftlo' nó gần như gấp đôi kích thước. – Muis

+2

* LTO * là một tính năng mới của GCC. Cả phiên bản * gold * (new linker) và phiên bản * gcc * sẽ ảnh hưởng đến việc tạo mã. Bạn ** nên ** cung cấp cho trình liên kết với cùng các tùy chọn tối ưu hóa khi bạn biên dịch. Đây là một thay đổi với * LTO * mà một số người không biết. '-O3' không phải là để tối ưu hóa cho kích thước nhưng hiệu suất. Nếu bạn thực sự muốn kích thước, bạn nên thử '-Os' cho cả hai biên dịch và liên kết. –

+1

@Muis Bạn nên cố gắng loại bỏ các tệp nhị phân bằng cách sử dụng lệnh 'strip'. –

0

Điều quan trọng đối với LTO là hỗ trợ plugin trình liên kết hoạt động. Chỉ với GCC đó mới có thể thực hiện loại bỏ mã không thể truy cập được bằng agressive và các optimizaitons khác. Đảm bảo bạn có trình liên kết bật plugin (chỉ cần thử nếu liên kết LTO hoạt động với -fuse-linker-plugin)

+0

Có, tôi đã giải quyết được sự cố. Đó là một lỗi trong IDE của tôi (LPXPresso), nơi cài đặt chỉ áp dụng cho trình biên dịch chứ không phải trình liên kết. – Muis

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