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, и, как и ожидалось - никакого эффекта. :roll:
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. И это простая консольная программа, которая выводит на экран всего одну строчку. :shock:

Делал так:

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" в командную строку. Теперь программа работает. :mrgreen:
Siemargl wrote:Для трудных случаев есть mtdbg - прошагать хотя бы до старта _main() - он при наличии .map файла символы функций покажет.
Ясно.