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.dll
vàkernel32.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.dll
vàkernel32.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ớimsvcrt_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.dll
vàkernel32.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)
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)! –
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
@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