Page 3 of 3
Re: Минимальная граф. программа для Колибри без лишних зависимостей на C (gcc, Linux)
Posted: Sat May 27, 2017 12:45 pm
by JohnXenox
Siemargl wrote:перед objcopy надо делать strip - удаляет ненужную для отладки инфу
Флаг
-g я убрал в
kos32-gcc, поэтому удалять нечего. Всё равно попробовал применить разные ключи в
kos32-ld и
kos32-objcopy, и, как и ожидалось - никакого эффекта.
Siemargl wrote:вариант 2 - собирать с libc.dll.a (strip все= нужен)
Понятно, позже попробую.
Re: Минимальная граф. программа для Колибри без лишних зависимостей на C (gcc, Linux)
Posted: Sat May 27, 2017 4:20 pm
by JohnXenox
punk_joker wrote:только в параметры линковщика добавь параметр --subsystem native, если не ошибаюсь, иначе с запуском программы будет выскакивать окно консоли
Спасибо, очень помогло.
Re: Минимальная граф. программа для Колибри без лишних зависимостей на C (gcc, Linux)
Posted: Sat May 27, 2017 4:44 pm
by JohnXenox
Siemargl wrote:вариант 2 - собирать с libc.dll.a (strip все= нужен)
Попробовал с libc.dll.a, и всё равно очень много - 74.2k. И это простая консольная программа, которая выводит на экран всего одну строчку.
Делал так:
Code: Select all
app_name=hello
dir_path=/usr/local/kos32
subsys_arg='console'
kos32-ld -static -nostdlib --subsystem $subsys_arg -T $dir_path/sdk/sources/newlib/app-dynamic.lds -Map=$app_name.map -L $dir_path/lib -L $dir_path/sdk/lib -o $app_name $app_name.o -lc -lgcc -lc.dll
Re: Минимальная граф. программа для Колибри без лишних зависимостей на C (gcc, Linux)
Posted: Sat May 27, 2017 5:06 pm
by JohnXenox
Надо было ко всем ключам
-lc добавить
.dll.
Теперь строка такая:
Code: Select all
app_name=hello
dir_path=/usr/local/kos32
subsys_arg='console'
kos32-ld -static -nostdlib --subsystem $subsys_arg -T $dir_path/sdk/sources/newlib/app-dynamic.lds -Map=$app_name.map -L $dir_path/lib -L $dir_path/sdk/lib -o $app_name $app_name.o -lc.dll -lgcc -lc.dll
Файл уменьшился, но всё равно давольно большой - 9.4k.
Re: Минимальная граф. программа для Колибри без лишних зависимостей на C (gcc, Linux)
Posted: Sat May 27, 2017 6:02 pm
by akron1
JohnXenox wrote:Файл уменьшился, но всё равно давольно большой - 9.4k.
Так это неплохо. Компиляторы ЯВУ обычно добавляют в исполняемый файл служебный код ("ран-тайм"). Можно считать, что 9.4 Кб -- это константа, которая будет добавлена к любой программе. Если полезный размер программы 10 Кб, то "лишние" 9.4 Кб -- это много. Но для программы ~500 Кб +-10Кб несущественно. Часто ЯВУ сравнивают с ассемблером на примерах вроде "hello, world" и в этом случае разница получается значительной. Но для больших программ эта разница незаметна. Хороший компилятор может создать даже более плотный код. И кроме того, исполняемые файлы в KolibriOS принято упаковывать, что практически сводит на нет разницу в размерах программ между ЯВУ и асмом. Конечно, это справедливо для программ более сложных, чем "hello, world", но для этого и нужны ЯВУ.
Re: Минимальная граф. программа для Колибри без лишних зависимостей на C (gcc, Linux)
Posted: Sat May 27, 2017 6:26 pm
by Kopa
akron1 wrote: И кроме того, исполняемые файлы в KolibriOS принято упаковывать, что практически сводит на нет разницу в размерах программ между ЯВУ и асмом.
При упаковке Forth для KolibriOS размер системы уменьшился с примерно c 150Кб до примерно 24Кб и это при том, что в исполняемом файле
примерно больше половины размера занимает встроенный макрооптимизатор
Re: Минимальная граф. программа для Колибри без лишних зависимостей на C (gcc, Linux)
Posted: Sat May 27, 2017 6:42 pm
by JohnXenox
akron1 wrote:JohnXenox wrote:Файл уменьшился, но всё равно давольно большой - 9.4k.
Так это неплохо. Компиляторы ЯВУ обычно добавляют в исполняемый файл служебный код ("ран-тайм"). Можно считать, что 9.4 Кб -- это константа, которая будет добавлена к любой программе. Если полезный размер программы 10 Кб, то "лишние" 9.4 Кб -- это много. Но для программы ~500 Кб +-10Кб несущественно. Часто ЯВУ сравнивают с ассемблером на примерах вроде "hello, world" и в этом случае разница получается значительной. Но для больших программ эта разница незаметна. Хороший компилятор может создать даже более плотный код. И кроме того, исполняемые файлы в KolibriOS принято упаковывать, что практически сводит на нет разницу в размерах программ между ЯВУ и асмом. Конечно, это справедливо для программ более сложных, чем "hello, world", но для этого и нужны ЯВУ.
Понятно. Но всё равно, хочется поменьше.
Файл-то уменьшился, но теперь, не понятно почему он не запускается. Потом забросил в папку к файлу libc.dll, из папки kolibrios(из дистра), и так же ничего.
Re: Минимальная граф. программа для Колибри без лишних зависимостей на C (gcc, Linux)
Posted: Sat May 27, 2017 6:59 pm
by Siemargl
Вот 9.4к это нормально. У тебя наверное там используется printf() - это очень сложная и большая по коду функция.
Замени на puts(), или можно использовать функции из console.obj - там есть простой аналог
В случае libc.dll код конечно не там сильно уменьшится, но в случае статической линковки - да
Наверное всё - это минимальный предел бинарника для gcc5.4 (gcc4.8 давала чуть меньше)
если ты запускаешься с .iso образа - в нем libc.dll уже вмонтирована, в дискетном образе ее нет
она не подхватывается из текущего каталога, а только из /kolibrios/lib
и, конечно, она должна быть одной версии (практически) с libc.dll.a и dynamic.lds
Re: Минимальная граф. программа для Колибри без лишних зависимостей на C (gcc, Linux)
Posted: Sat May 27, 2017 8:13 pm
by JohnXenox
Siemargl wrote:Вот 9.4к это нормально. У тебя наверное там используется printf() - это очень сложная и большая по коду функция.
Замени на puts(), или можно использовать функции из console.obj - там есть простой аналог
В случае libc.dll код конечно не там сильно уменьшится, но в случае статической линковки - да
Наверное всё - это минимальный предел бинарника для gcc5.4 (gcc4.8 давала чуть меньше)
Да printf(). Сейчас скомпилировал тот-же файл под Linux и там, исполняемый файл - 8.4k.
Siemargl wrote:если ты запускаешься с .iso образа - в нем libc.dll уже вмонтирована, в дискетном образе ее нет
она не подхватывается из текущего каталога, а только из /kolibrios/lib
и, конечно, она должна быть одной версии (практически) с libc.dll.a и dynamic.lds
Нет. Kolibri.img запускаю через GRUB2. И есть раздел(fat32) на котором есть папка kolibrios, взятая из дистра (svn6900). Папка kolibrios отображается в Eolite, как раздел диска. На том же разделе мой исп. файл в папке. Но всё равно не работает.
P.S.
Погуглил по исполняемому файлу в Linux. Гугл сообщил, что файл содержит заголовок ELF со служебной инфой, и заголовок этот давольно большой.
Там ещё понятно, почему исполняемый файл такой большой. Но по сравнению с заголовком в Kolibri - это как-то странно. По идее исп. файл Kolibri, должен быть значительно меньше, чем в Linux, а он наоборот, больше.
Да и printf() не должна быть такой большой, то ж вывод 1-й малюсенькой строчки. Чего-то неверится. Видимо, что-то лишнее туда пишется.
Ну ладно, потом буду разбираться с этим, а сейчас меня больше интересует почему мой исполняемый файл для Kolibri не запускается.
Re: Минимальная граф. программа для Колибри без лишних зависимостей на C (gcc, Linux)
Posted: Sun May 28, 2017 12:15 am
by Siemargl
Почему бинарник от gcc относительно большой - можно увидеть в map файле - там всегда есть С++ базовые вещи, вроде TLS и EH.
Я думаю, что это теоретически можно улучшить, но поможет это только хелловорлду и чистым С-программам, причем однопоточным.
Так что не первой необходимости, для минимальных программ есть ассемблер (оверхед 32 байта заголовка), c-- (32), и tcc (1Кб если только не трогать printf!)
Про запуск - проверяй наличие /kolibrios/lib/libc.dll и версий. Можешь попробовать пересобрать newllib
Для трудных случаев есть mtdbg - прошагать хотя бы до старта _main() - он при наличии .map файла символы функций покажет.
Re: Минимальная граф. программа для Колибри без лишних зависимостей на C (gcc, Linux)
Posted: Sun May 28, 2017 3:22 pm
by JohnXenox
Siemargl wrote:Почему бинарник от gcc относительно большой - можно увидеть в map файле - там всегда есть С++ базовые вещи, вроде TLS и EH.
Я думаю, что это теоретически можно улучшить, но поможет это только хелловорлду и чистым С-программам, причем однопоточным.
Так что не первой необходимости, для минимальных программ есть ассемблер (оверхед 32 байта заголовка), c-- (32), и tcc (1Кб если только не трогать printf!)
Ясно.
Siemargl wrote:Про запуск - проверяй наличие /kolibrios/lib/libc.dll и версий. Можешь попробовать пересобрать newllib
Нет, всё оказалось намного проще. Я просто забыл дописать ключь "--image-base 0" в командную строку. Теперь программа работает.
Siemargl wrote:Для трудных случаев есть mtdbg - прошагать хотя бы до старта _main() - он при наличии .map файла символы функций покажет.
Ясно.