2011-12-17 27 views
5

Khi tôi biên soạn một chương trình không-op:Giảm kích thước mã EXE mục tiêu GCC?

int main(void) 
{ 
    return 0; 
} 

với trình biên dịch khác nhau:

  • GCC (kết quả tương tự như LLVM cũng): Đã đưa ra một thực thi 10 KiB (biên soạn với -s)

    • Chuyên mục chính: .CRT, .bss, .data, .idata, .rdata, .text, .tls

    • Phụ thuộc vào msvcrt.dllkernel32.dll

  • MSVC 2010: Đã đưa ra một 5,5 KiB thực thi (biên soạn với /MD /Ox)

    • Chuyên mục chính: .data, .rdata , .reloc, .text

    • Phụ thuộc vào msvcr100.dllkernel32.dll

    • thể đã được giảm hơn nữa bằng cách sáp nhập .rdata với .text

  • Windows Driver Kit 7.1: Đã đưa ra một 6,5 KiB thực thi (biên soạn với /MD /Ox, liên kết với msvcrt_winxp.obj để cho phép ứng dụng chạy trên XP)

    • Chuyên mục chính: .data, .rdata, .text

    • Phụ thuộc vào msvcrt.dllkernel32.dll

    • thể đã được giảm hơn nữa bằng cách sáp nhập .rdata với .text

  • Windows 2003 Phát triển Driver Kit: Đã đưa ra một 3.5 KiB có thể thực thi

    • Chuyên mục chính: .data, .rdata, .text

    • Phụ thuộc vào msvcrt.dll

    • thể đã được giảm hơn nữa bằng cách sáp nhập .rdata với .text

  • Tiny C Compiler (TCC): Đã đưa ra một 1.5 KiB thực thi

    • Chuyên mục chính: .data, .text

    • Phụ thuộc vào msvcrt.dll

Vì vậy, tôi đoán câu hỏi rất đơn giản:

Có thể thêm giảm kích thước mục tiêu thực thi của GCC hoặc LLVM để chúng gần với mức tối thiểu có thể, trong khi vẫn liên kết với msvcrt.dll?

(Edit: Tôi rõ ràng là không tìm kiếm đóng gói như UPX, vv)

+0

Bạn có thể giải thích tại sao bạn hỏi? Bạn có thường biên dịch một chương trình nhỏ như vậy không? Không phải là nó quan trọng hơn cho một trình biên dịch để biên dịch các chương trình thực tế tốt? (hầu hết trong số họ là lớn hơn nhiều)! –

+0

http://stackoverflow.com/questions/1413171/what-is-strip-gcc-application-used-for, http://embeddedfreak.wordpress.com/2009/02/10/removing-unused-functionsdead-codes -with-gccgnu-ld/ – Ulterior

+0

@Ulterior: Tùy chọn '-s' khá giống với' strip'. Các tùy chọn khác cũng không giúp được gì. – Mehrdad

Trả lời

2

Đây không phải là một điều đặc biệt có ý nghĩa để làm. Nó có thể có thể loại bỏ một vài điều, nhưng ngay sau khi bạn có một chương trình mà thực sự làm bất cứ điều gì sau đó nó sẽ kéo những điều đó thẳng trở lại trong một lần nữa. Ví dụ, trên một nền tảng khác (tôi không làm nhiều thứ Windows), kích thước tối thiểu cho một chương trình lớn hơn bạn nghĩ bởi vì mọi chương trình đều có trình xử lý ngoại tuyến để dọn dẹp. Trình xử lý đó có một trường hợp lỗi có thể có nghĩa là nó lấy printf và tất cả các công cụ I/O. Bản thân Atexit cũng kéo vào malloc và tất cả các thứ ghi nhớ. Và không có nghi ngờ có một vài bit khác bên cạnh. Kết quả cuối cùng là kích thước nhị phân tĩnh 400KB. Điều đó gây phiền toái trong một chương trình không-op, nhưng trên thực tế tất cả các chương trình sẽ cần công cụ này, vì vậy nó là một điểm tranh luận.

Nói chung, nếu bạn muốn giảm thiểu kích thước chương trình, biên soạn với -Os, và cố gắng sử dụng -fltohoặc-fwhole-program (nhưng cuối cùng này sẽ cần rất nhiều thay đổi thủ tục xây dựng của bạn). Ngoài ra, không sử dụng -g và loại bỏ các tệp nhị phân cuối cùng (nếu điều đó không phá vỡ chúng).

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