2010-09-07 32 views
5

weirdnessGCC Giảm Binary Bloat - Strange Side Effect

tôi đã biên soạn Google Nghị định thư Buffers không sử dụng các thông số bổ sung cho một "sưng" biên dịch và biên dịch bằng lệnh sau ./configure CXXFLAGS="-ffunction-sections -fdata-sections". một du-h tiết lộ:

120K ./bloat/bin 
124K ./bloat/include/google/protobuf/io 
8.0K ./bloat/include/google/protobuf/compiler/java 
12K ./bloat/include/google/protobuf/compiler/python 
8.0K ./bloat/include/google/protobuf/compiler/cpp 
128K ./bloat/include/google/protobuf/compiler 
52K ./bloat/include/google/protobuf/stubs 
848K ./bloat/include/google/protobuf 
852K ./bloat/include/google 
856K ./bloat/include 
12K ./bloat/lib/pkgconfig 
37M ./bloat/lib 
38M ./bloat 
20K ./unbloat/bin 
124K ./unbloat/include/google/protobuf/io 
8.0K ./unbloat/include/google/protobuf/compiler/java 
12K ./unbloat/include/google/protobuf/compiler/python 
8.0K ./unbloat/include/google/protobuf/compiler/cpp 
128K ./unbloat/include/google/protobuf/compiler 
52K ./unbloat/include/google/protobuf/stubs 
848K ./unbloat/include/google/protobuf 
852K ./unbloat/include/google 
856K ./unbloat/include 
12K ./unbloat/lib/pkgconfig 
15M ./unbloat/lib 
16M ./unbloat 
53M . 

khoan Down:

ls -gGh bloat/lib/ 
    total 37M 
    -rw-r--r-- 1 13M 2010-09-07 13:57 libprotobuf.a 
    -rwxr-xr-x 1 986 2010-09-07 13:57 libprotobuf.la 
    -rw-r--r-- 1 1.6M 2010-09-07 13:57 libprotobuf-lite.a 
    -rwxr-xr-x 1 1021 2010-09-07 13:57 libprotobuf-lite.la 
    lrwxrwxrwx 1 25 2010-09-07 13:57 libprotobuf-lite.so -> libprotobuf-lite.so.6.0.0 
    lrwxrwxrwx 1 25 2010-09-07 13:57 libprotobuf-lite.so.6 -> libprotobuf-lite.so.6.0.0 
    -rwxr-xr-x 1 771K 2010-09-07 13:57 libprotobuf-lite.so.6.0.0 
    lrwxrwxrwx 1 20 2010-09-07 13:57 libprotobuf.so -> libprotobuf.so.6.0.0 
    lrwxrwxrwx 1 20 2010-09-07 13:57 libprotobuf.so.6 -> libprotobuf.so.6.0.0 
    -rwxr-xr-x 1 5.5M 2010-09-07 13:57 libprotobuf.so.6.0.0 
    -rw-r--r-- 1 12M 2010-09-07 13:57 libprotoc.a 
    -rwxr-xr-x 1 1.1K 2010-09-07 13:57 libprotoc.la 
    lrwxrwxrwx 1 18 2010-09-07 13:57 libprotoc.so -> libprotoc.so.6.0.0 
    lrwxrwxrwx 1 18 2010-09-07 13:57 libprotoc.so.6 -> libprotoc.so.6.0.0 
    -rwxr-xr-x 1 4.6M 2010-09-07 13:57 libprotoc.so.6.0.0 
    drwxr-xr-x 2 4.0K 2010-09-07 13:57 pkgconfig 
    ls -gGh unbloat/lib/ 
    total 15M 
    -rw-r--r-- 1 5.8M 2010-09-07 14:03 libprotobuf.a 
    -rwxr-xr-x 1 988 2010-09-07 14:03 libprotobuf.la 
    -rw-r--r-- 1 764K 2010-09-07 14:03 libprotobuf-lite.a 
    -rwxr-xr-x 1 1023 2010-09-07 14:03 libprotobuf-lite.la 
    lrwxrwxrwx 1 25 2010-09-07 14:03 libprotobuf-lite.so -> libprotobuf-lite.so.6.0.0 
    lrwxrwxrwx 1 25 2010-09-07 14:03 libprotobuf-lite.so.6 -> libprotobuf-lite.so.6.0.0 
    -rwxr-xr-x 1 393K 2010-09-07 14:03 libprotobuf-lite.so.6.0.0 
    lrwxrwxrwx 1 20 2010-09-07 14:03 libprotobuf.so -> libprotobuf.so.6.0.0 
    lrwxrwxrwx 1 20 2010-09-07 14:03 libprotobuf.so.6 -> libprotobuf.so.6.0.0 
    -rwxr-xr-x 1 2.7M 2010-09-07 14:03 libprotobuf.so.6.0.0 
    -rw-r--r-- 1 3.7M 2010-09-07 14:04 libprotoc.a 
    -rwxr-xr-x 1 1.1K 2010-09-07 14:04 libprotoc.la 
    lrwxrwxrwx 1 18 2010-09-07 14:04 libprotoc.so -> libprotoc.so.6.0.0 
    lrwxrwxrwx 1 18 2010-09-07 14:04 libprotoc.so.6 -> libprotoc.so.6.0.0 
    -rwxr-xr-x 1 1.3M 2010-09-07 14:04 libprotoc.so.6.0.0 
    drwxr-xr-x 2 4.0K 2010-09-07 14:03 pkgconfig 

Các Câu hỏi

tôi đã không thay đổi việc xây dựng kịch bản để thực hiện một "--gc-sections" trong liên kết, do đó shouldn' t xây dựng unbloat là như nhau nếu không lớn hơn? Điều gì làm giảm kích thước?

nền

Tôi đang soạn thảo một thư viện ở mức độ thấp với gcc vào lúc này và thư viện là một 2.5MB ginormous unstriped và 970KB tước. Điều này là không thể chấp nhận được, và tôi cần phải loại bỏ mã chết - tôi phụ thuộc vào OpenSSL, Protocol Buffers và 3 Libraries từ Boost, và tôi sẽ liên kết tĩnh 2 cuối cùng vào thư viện của tôi. Hai thư viện liên kết tĩnh sẽ phải được biên dịch chúng với các phần "-ffunction-sections -fdata-section" để loại bỏ mã chết.

liên quan Câu hỏi

My next question là về làm thế nào để xác định nguồn gốc sử dụng để loại bỏ mã chết.

+1

phải xóa bài đăng cũ vì tôi có một bài đăng đôi vì một lý do nào đó. Có 2,5 MB là ginormous - Tôi đã viết thư viện tương tự và có thể nhận được chúng xuống đến 80-300kb (sử dụng MSVC). Chuỗi công cụ GCC sẽ có thể thực hiện tương tự. –

+0

@Hassan Syed, tôi nghĩ rằng phần nền của bạn gây ra nhiều vấn đề hơn là giải quyết. Nó không liên quan đến câu hỏi, và nó làm cho nó âm thanh như bạn đang yêu cầu các cách để giảm kích thước tập tin của một nhị phân. Tôi sẽ loại bỏ nó, hoặc đặt nó ở phần cuối của câu hỏi. – strager

+0

Kích thước không bị xói mòn không được tính. Vì điều đó chứa tất cả các nội dung bổ sung mà bạn muốn xóa và không thực sự liên quan đến sản xuất. –

Trả lời

1

Tôi e rằng mức tăng không có gì liên quan đến -ffunction-sections -fdata-sections: khi bạn chỉ định CXXFLAGS="-ffunction-sections -fdata-sections" trên dòng lệnh cấu hình, bạn ghi đè các cờ mặc định là -O2 -g -DNDEBUG. Kết quả là, mã của bạn đã được biên dịch mà không có tối ưu hóa.

Bạn nên làm lại bài kiểm tra của mình với CXXFLAGS="-ffunction-sections -fdata-sections -O2 -g -DNDEBUG" và bạn sẽ nhận được kết quả mong đợi (tức là, giống hệt).

+0

Ông sẽ * chắc chắn nhất * không nhận được kết quả giống hệt nhau, nhưng lý thuyết của bạn về thiếu -O2 có phần hợp lý. Tuy nhiên, nếu anh ta thực sự biên dịch mà không có '-g', thì "sưng húp" của anh ta nên có * nhiều * nhỏ hơn, điều này mâu thuẫn với sự thật. –

+0

Tôi đã kiểm tra "lý thuyết" trước khi đăng :) Tất nhiên, kết quả sẽ không giống hệt nhau (vì các cuộc gọi mặt cắt ngang sẽ diễn ra thay vì các cuộc gọi PC tương đối trong cùng một mô-đun đối tượng) nhưng sự khác biệt về kích thước sẽ rất nhỏ bé. Liên quan đến vấn đề "nhỏ hơn nhiều", đừng quên rằng mã được biên dịch với '-O0' thường lớn hơn mã được biên dịch với' -O2', mà đối trọng một chút sự vắng mặt của '-g'. –

+0

Điều này nghe có vẻ giống như nguyên nhân có khả năng nhất, Cảm ơn bạn đã giải thích. –

1

Biên soạn với -ffunction-sections gây mỗi chức năng để được giải phóng vào phần riêng của mình, và điều đó khiến mỗi tập tin đối tượng để trở nên lớn hơn (thay vì chỉ .text phần, bây giờ bạn có .text.foo, .text.bar, vv). Tương tự cho -fdata-sections. Vì vậy, kết quả bạn đã có là chính xác những gì mong đợi.

Nhưng bạn không nên quan tâm đến diện tích xây dựng của bạn lớn đến mức nào. Điều bạn nên quan tâm đến mức độ thực thi lớn nhất của bạn (hoặc thư viện được chia sẻ) là bao nhiêu.

Với các cờ bạn đã chỉ định, tệp thi hành "bloat" có thể vẫn lớn hơn (nhưng có thể không nhiều). Bây giờ, hãy thêm -Wl,--gc-sections và tệp thực thi "bloat" của bạn sẽ trở nên nhỏ hơn đáng kể.