LINUX.ORG.RU

C++ и размер бинарника

 


0

1

Сейчас под рукой линукса нету, прошу подсказать с результатом компиляции этих hello world:

#include <iostream>
using namespace std;
int main() {
	cout << "Привет" << endl;
	return 0;
}
и
#include <stdio.h>

int main() {
	printf("Привет\n");
	return 0;
}
У меня под виндой c++ && strip && upx -9 дали результаты:
C - 8192 байт
C++ - 254464 байт
Жирность Си++-бинарника - это фича винды, или под линуксом тоже в десятки раз жирнее?

★★★★★

$ g++ -O -o hw hw.cpp
$ ls -l hw
.... 9039 авг.   3 12:40 hw
io ★★ ()

Как-то 254464 даже для делфей жирновато. Не статически компилил случаем?

Radjah ★★★★★ ()

GCC 4.8.4
c++ - 8526 B
c - 7909 B

anonymous ()
Ответ на: комментарий от Radjah

Не статически компилил случаем?

Нет. Не статически.

@C:\TDM-GCC-64\bin\c++.exe -o rpt.exe rpt.cpp
@C:\TDM-GCC-64\bin\strip.exe rpt.exe
@D:\UTILS\upx.exe rpt.exe

даже для делфей жирновато

Угу.
Delphi 7 (DCC32.EXE) генерит HW-бинарник 9216 байт,
Lazarus (fpc.exe, 2.6.4) - размером 36352 байта, который жмётся strip+UPX'ом до 15872 байт.

@"D:\lazarus\fpc\2.6.4\bin\x86_64-win64\fpc.exe" test.pas
@"D:\lazarus\fpc\2.6.4\bin\x86_64-win64\strip.exe" test.exe
@D:\UTILS\upx.exe test.exe

pacify ★★★★★ ()
-rwxrwxr-x 1 golovin golovin    8552 авг.   3 11:43 c.dynamic
-rwxrwxr-x 1 golovin golovin    6280 авг.   3 11:46 c.dynamic.stripped
-rwxrwxr-x 1 golovin golovin    9168 авг.   3 11:46 cpp.dynamic
-rwxrwxr-x 1 golovin golovin    6320 авг.   3 11:46 cpp.dynamic.stripped
-rwxrwxr-x 1 golovin golovin 1698016 авг.   3 11:51 cpp.static
-rwxrwxr-x 1 golovin golovin 1419168 авг.   3 11:54 cpp.static.stripped
-rwxrwxr-x 1 golovin golovin  515600 авг.   3 11:55 cpp.static.stripped.compressed
-rwxrwxr-x 1 golovin golovin  882128 авг.   3 11:51 c.static
-rwxrwxr-x 1 golovin golovin  808256 авг.   3 11:55 c.static.stripped
-rwxrwxr-x 1 golovin golovin  319056 авг.   3 11:55 c.static.stripped.compressed
-rw-rw-r-- 1 golovin golovin      73 авг.   3 11:43 test.c
-rw-rw-r-- 1 golovin golovin     100 авг.   3 11:43 test.cpp
CYB3R ★★★★★ ()
$ g++ test.cc -o test
$ ls -l test
-rwx------ 1 vasya vasya 9,8K авг  3 12:02 test

$ g++ -Os test.cc -o test -fdata-sections -ffunction-sections -Wl,--gc-sections,--print-gc-sections
$ strip --remove-section=.comment --remove-section=.note.gnu.gold-version --strip-all test
$ ls -l test
-rwx------ 1 vasya vasya 5,2K авг  3 12:03 test
anonymous ()
Ответ на: комментарий от CYB3R

Добавил ещё одного претендента на победу:

-rwxrwxr-x 1 golovin golovin    8552 авг.   3 11:43 c.dynamic
-rwxrwxr-x 1 golovin golovin    6280 авг.   3 11:46 c.dynamic.stripped
-rwxrwxr-x 1 golovin golovin    9168 авг.   3 11:46 cpp.dynamic
-rwxrwxr-x 1 golovin golovin    6320 авг.   3 11:46 cpp.dynamic.stripped
-rwxrwxr-x 1 golovin golovin 1698016 авг.   3 11:51 cpp.static
-rwxrwxr-x 1 golovin golovin 1419168 авг.   3 11:54 cpp.static.stripped
-rwxrwxr-x 1 golovin golovin  515600 авг.   3 11:55 cpp.static.stripped.compressed
-rwxrwxr-x 1 golovin golovin  882128 авг.   3 11:51 c.static
-rwxrwxr-x 1 golovin golovin  808256 авг.   3 11:55 c.static.stripped
-rwxrwxr-x 1 golovin golovin  319056 авг.   3 11:55 c.static.stripped.compressed
-rw-rw-r-- 1 golovin golovin      73 авг.   3 11:43 test.c
-rw-rw-r-- 1 golovin golovin     100 авг.   3 11:43 test.cpp
-rw-rw-r-- 1 golovin golovin      53 авг.   3 12:02 test.vala
-rwxrwxr-x 1 golovin golovin    8640 авг.   3 12:03 vala.dynamic
-rwxrwxr-x 1 golovin golovin    6280 авг.   3 12:04 vala.dynamic.stripped
-rwxrwxr-x 1 golovin golovin  882104 авг.   3 12:03 vala.static
-rwxrwxr-x 1 golovin golovin  808256 авг.   3 12:03 vala.static.stripped
-rwxrwxr-x 1 golovin golovin  319000 авг.   3 12:04 vala.static.stripped.compressed

CYB3R ★★★★★ ()
Ответ на: комментарий от CYB3R

Ещё шлангом попробуй, шлангом! Публика требует! :)

anonymous ()
Ответ на: комментарий от anTaRes

Я собирал без всяких оптимизаций:

$ gcc test.c -o c.dynamic
$ gcc -static test.c -o c.static
$ g++ test.cpp -o cpp.dynamic
$ g++ -static test.cpp -o cpp.static
$ valac test.vala -o vala.dynamic
$ valac -X -static -o vala.static
$ strip c.dynamic.stripped
$ strip cpp.dynamic.stripped
$ strip vala.dynamic.stripped
$ strip c.static.stripped
$ strip cpp.static.stripped
$ strip vala.static.stripped
$ upx -9 c.static.stripped.compressed
$ upx -9 cpp.static.stripped.compressed
$ upx -9 vala.static.stripped.compressed

CYB3R ★★★★★ ()
Ответ на: комментарий от anonymous

Подскажи, какие опции лучше использовать, чтобы получить минимальный размер бинарника.

CYB3R ★★★★★ ()
Ответ на: комментарий от CYB3R

Притащил откуда-то с Хабра.

BITS 32;
ORG 05430000h;

DB 0x7F, "ELF";
DD 01h, 00h, $$;
DW 02h, 03h;
DD @main;
DW @main - $$;

@main:
  INC EBX;
  DB 05h; <-- ADD EAX,
  DD 04h; <-- LONG(04h)
  MOV ECX, @text;
  MOV DL, 12;
  INT 80h;
  AND EAX, 00010020h;
  XCHG EAX, EBX;
  INT 80h;

@text:
  DB "ELF, hello!", 0Ah;
Компиляция:
yasm -f bin -m x32 -o hw hw.asm

pacify ★★★★★ ()
Ответ на: комментарий от CYB3R
$ gcc -static c.c -o c.static
$ strip c.static -o c.static.stripped
$ upx -9 c.static.stripped -o c.static.stripped.compressed
$ ls -l c.static* | awk '{print $5 " : " $9}'
814240 : c.static
742848 : c.static.stripped
270204 : c.static.stripped.compressed

$ uname -srmpi
Linux 4.1.3-gentoo x86_64 AMD Athlon(tm) II X3 435 Processor AuthenticAMD

gcc-5.2.0

anTaRes ★★★★ ()

Вангую, что он слинковался с libgcc и прочими libstdc++

yurikoles ★★★ ()
Ответ на: комментарий от anTaRes
$ ls -l c.static*clang | awk '{print $5 " : " $9}'
814320 : c.static.clang
742896 : c.static.stripped.clang
270252 : c.static.stripped.compressed.clang

шланг-3.6.2 с такими-же опциями

anTaRes ★★★★ ()

Вот зачем ты в embedded пихаешь printf? А уж С++ и cout — вообще финиш!

Eddy_Em ☆☆☆☆☆ ()

Вот — фиговина, которая парсит импульсы PPS и сообщения от GPS, чтобы вычислять точные временные интервалы (старт/финиш для даунхиллеров):

ls -l GPS.{bin,c}
-rwxr-xr-x 1 eddy eddy 9020 авг  3 01:07 GPS.bin*
-rw-r--r-- 1 eddy eddy 6320 авг  3 00:51 GPS.c
(код).

А вот — управлялка спектрографом (5 шаговых двигателей, 8 платиновых терморезисторов, 8 1-wire термометров, затвор, куча всяких концевиков и Холлов...):

ls -l *.{bin,c,h} 
-rw-r--r-- 1 eddy eddy  7481 июл 28 11:37 AD7794.c
-rw-r--r-- 1 eddy eddy  9478 авг 13  2014 AD7794.h
-rw-r--r-- 1 eddy eddy 10023 июл 28 11:37 cdcacm.c
-rw-r--r-- 1 eddy eddy  1679 окт 23  2014 cdcacm.h
-rw-r--r-- 1 eddy eddy  4233 июл 28 14:45 flash.c
-rw-r--r-- 1 eddy eddy  2142 июл 28 11:43 flash.h
-rw-r--r-- 1 eddy eddy 11292 июл 28 19:41 hardware_ini.c
-rw-r--r-- 1 eddy eddy  5208 июл 28 13:59 hardware_ini.h
-rwxr-xr-x 1 eddy eddy 27252 июл 28 15:04 ircontroller.bin*
-rw-r--r-- 1 eddy eddy  8758 июл 28 15:02 main.c
-rw-r--r-- 1 eddy eddy  2020 июл 28 11:35 main.h
-rw-r--r-- 1 eddy eddy 15103 июл 28 14:58 onewire.c
-rw-r--r-- 1 eddy eddy  4126 июл 28 14:58 onewire.h
-rw-r--r-- 1 eddy eddy 13274 июл 28 13:58 powerhw.c
-rw-r--r-- 1 eddy eddy  1794 апр 15 11:42 powerhw.h
-rw-r--r-- 1 eddy eddy  4922 янв 27  2015 spi.c
-rw-r--r-- 1 eddy eddy  1175 окт 16  2014 spi.h
-rw-r--r-- 1 eddy eddy 16253 июл 28 11:43 stepper_motors.c
-rw-r--r-- 1 eddy eddy  4154 апр 22 17:32 stepper_motors.h
-rw-r--r-- 1 eddy eddy  2286 янв 26  2015 sync.c
-rw-r--r-- 1 eddy eddy  1672 янв 26  2015 sync.h
-rw-r--r-- 1 eddy eddy  8814 июл 28 13:39 uart.c
-rw-r--r-- 1 eddy eddy  1469 окт 28  2014 uart.h
-rw-r--r-- 1 eddy eddy 19057 июл 28 14:30 user_proto.c
-rw-r--r-- 1 eddy eddy  3539 июл 15 17:37 user_proto.h
(код).

Это я к тому, что нефиг в эмбеддщину пхать всякие stdio, софтовые флоаты и прочую непотребность.

Eddy_Em ☆☆☆☆☆ ()

В винде он тащит с собой стандартную библиотеку ++

frame ★★★ ()
Ответ на: комментарий от Eddy_Em

Мне кажется, автор случайно тег влепил.

CYB3R ★★★★★ ()
Ответ на: комментарий от CYB3R

Мне кажется, автор случайно тег влепил

Нет. Просто это ближе к embedded (уменьшение размера бинарей), чем к общим вопросам сборки.

pacify ★★★★★ ()
Ответ на: комментарий от pacify

Так тебя именно уменьшение размера интересует?

CYB3R ★★★★★ ()
Ответ на: комментарий от CYB3R

Так тебя именно уменьшение размера интересует?

Да. По теме я нашёл вот это обсуждение на Stackoverflow. И я попробовал как по этой ссылке добавить опцию -static-libgcc. Размер не изменился. Значит stdc++ была слинкована статически. А вот -Wl,-Bdynamic -lstdc++ не подействовало. Похоже, G++ под Windows так не умеет.

pacify ★★★★★ ()
Ответ на: комментарий от anTaRes

ls -l c.static*clang | awk '{print $5 " : " $9}'

Мои результаты с gcc:

$ find . -executable -type f -printf "%s\t%p\n" | sort -h
6280	./c.dynamic.stripped
6280	./vala.dynamic.stripped
6312	./cpp.dynamic.stripped
8552	./c.dynamic
8640	./vala.dynamic
9040	./cpp.dynamic
318856	./vala.static.stripped.compressed
319072	./cpp.static.stripped.compressed
319072	./c.static.stripped.compressed
808256	./cpp.static.stripped
808256	./c.static.stripped
808256	./vala.static.stripped
882104	./vala.static
882128	./c.static
1697944	./cpp.static
Мои результаты с clang:
golovin@u410:~/test$ find . -executable -type f -printf "%s\t%p\n" | sort -h
4416	./c.dynamic.stripped
4976	./vala.dynamic.stripped
5760	./cpp.dynamic.stripped
6664	./c.dynamic
7328	./vala.dynamic
8624	./cpp.dynamic
318940	./vala.static.stripped.compressed
319000	./cpp.static.stripped.compressed
319000	./c.static.stripped.compressed
805568	./vala.static.stripped
806016	./cpp.static.stripped
806016	./c.static.stripped
879416	./vala.static
879864	./c.static
1699656	./cpp.static

CYB3R ★★★★★ ()
Ответ на: комментарий от pacify

Просто Windows и Embedded как-то не сочетаются, мне кажется.

CYB3R ★★★★★ ()
Ответ на: комментарий от pacify

уменьшение размера бинарей

тогда вот:

$ gcc -O0 -m32 c.c -o c.o32.nffp -fuse-ld=gold
внезапно 3392 (stripped)

пока самое меньшее, жаль что -m16 не работает :)

anTaRes ★★★★ ()
Ответ на: комментарий от CYB3R

Линукс не умеет в 16 бит.

На ASM/GCC вполне можно писать запускаемые проги для обычного реального режима (real mode), я писал такие. Сборка бинарей выполнялась под Debian. Записывал их на флешку в первые сектора диска, и грузился с неё.

pacify ★★★★★ ()
Ответ на: комментарий от anonymous

В таком случае это уже кросс-компиляция, в таком случае можно компилировать с -m16.

CYB3R ★★★★★ ()
Ответ на: комментарий от io
#include <iostream>
using namespace std;
int main() {
    cout << "Привет\n";
    return 0;
}
g++ -O -o test test.cpp
$ ls -l test
-rwxr-xr-x 1 dev dev 5900 авг  3 17:45 test
strip test
$ ls -l test
-rwxr-xr-x 1 dev dev 3832 авг  3 17:46 test
$ ls -l hw

Debian stable. gcc version 4.9.2 (Debian 4.9.2-10)

anonymous ()

gcc - 4512 g++ - 5584

$ cat test.c test_cpp.cpp 
#include <stdio.h>

int main(void)
{
	printf("Hello\n");
	return 0;
}
#include <iostream>

int main(void)
{
	std::cout << "Hello" <<std::endl;
}

если с оптимизацией по размеру, то 4424 и 5360

IvanR ★★ ()
Последнее исправление: IvanR (всего исправлений: 1)
Ответ на: комментарий от pacify

Чего только не придумают люди, лишь бы freedos не юзать :)

frame ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.