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 và 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.
Nguồn
2014-09-03 16:59:46
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)? –
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ã. –
@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