Минимальная граф. программа для Колибри без лишних зависимостей на C (gcc, Linux)

High-level languages programming questions
  • punk_joker wrote:только в параметры линковщика добавь параметр --subsystem native, если не ошибаюсь, иначе с запуском программы будет выскакивать окно консоли
    Спасибо, очень помогло. :)
    The Glass is Always Half Full! :mrgreen:
  • 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
    The Glass is Always Half Full! :mrgreen:
  • Надо было ко всем ключам -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. :(
    The Glass is Always Half Full! :mrgreen:
  • JohnXenox wrote:Файл уменьшился, но всё равно давольно большой - 9.4k. :(
    Так это неплохо. Компиляторы ЯВУ обычно добавляют в исполняемый файл служебный код ("ран-тайм"). Можно считать, что 9.4 Кб -- это константа, которая будет добавлена к любой программе. Если полезный размер программы 10 Кб, то "лишние" 9.4 Кб -- это много. Но для программы ~500 Кб +-10Кб несущественно. Часто ЯВУ сравнивают с ассемблером на примерах вроде "hello, world" и в этом случае разница получается значительной. Но для больших программ эта разница незаметна. Хороший компилятор может создать даже более плотный код. И кроме того, исполняемые файлы в KolibriOS принято упаковывать, что практически сводит на нет разницу в размерах программ между ЯВУ и асмом. Конечно, это справедливо для программ более сложных, чем "hello, world", но для этого и нужны ЯВУ.
  • akron1 wrote: И кроме того, исполняемые файлы в KolibriOS принято упаковывать, что практически сводит на нет разницу в размерах программ между ЯВУ и асмом.
    При упаковке Forth для KolibriOS размер системы уменьшился с примерно c 150Кб до примерно 24Кб и это при том, что в исполняемом файле
    примерно больше половины размера занимает встроенный макрооптимизатор :)
  • akron1 wrote:
    JohnXenox wrote:Файл уменьшился, но всё равно давольно большой - 9.4k. :(
    Так это неплохо. Компиляторы ЯВУ обычно добавляют в исполняемый файл служебный код ("ран-тайм"). Можно считать, что 9.4 Кб -- это константа, которая будет добавлена к любой программе. Если полезный размер программы 10 Кб, то "лишние" 9.4 Кб -- это много. Но для программы ~500 Кб +-10Кб несущественно. Часто ЯВУ сравнивают с ассемблером на примерах вроде "hello, world" и в этом случае разница получается значительной. Но для больших программ эта разница незаметна. Хороший компилятор может создать даже более плотный код. И кроме того, исполняемые файлы в KolibriOS принято упаковывать, что практически сводит на нет разницу в размерах программ между ЯВУ и асмом. Конечно, это справедливо для программ более сложных, чем "hello, world", но для этого и нужны ЯВУ.
    Понятно. Но всё равно, хочется поменьше. :(

    Файл-то уменьшился, но теперь, не понятно почему он не запускается. Потом забросил в папку к файлу libc.dll, из папки kolibrios(из дистра), и так же ничего. :(
    The Glass is Always Half Full! :mrgreen:
  • Вот 9.4к это нормально. У тебя наверное там используется printf() - это очень сложная и большая по коду функция.
    Замени на puts(), или можно использовать функции из console.obj - там есть простой аналог
    В случае libc.dll код конечно не там сильно уменьшится, но в случае статической линковки - да

    Наверное всё - это минимальный предел бинарника для gcc5.4 (gcc4.8 давала чуть меньше)

    если ты запускаешься с .iso образа - в нем libc.dll уже вмонтирована, в дискетном образе ее нет

    она не подхватывается из текущего каталога, а только из /kolibrios/lib

    и, конечно, она должна быть одной версии (практически) с libc.dll.a и dynamic.lds
  • 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 не запускается.
    The Glass is Always Half Full! :mrgreen:
  • Почему бинарник от gcc относительно большой - можно увидеть в map файле - там всегда есть С++ базовые вещи, вроде TLS и EH.
    Я думаю, что это теоретически можно улучшить, но поможет это только хелловорлду и чистым С-программам, причем однопоточным.

    Так что не первой необходимости, для минимальных программ есть ассемблер (оверхед 32 байта заголовка), c-- (32), и tcc (1Кб если только не трогать printf!)

    Про запуск - проверяй наличие /kolibrios/lib/libc.dll и версий. Можешь попробовать пересобрать newllib

    Для трудных случаев есть mtdbg - прошагать хотя бы до старта _main() - он при наличии .map файла символы функций покажет.
  • 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 файла символы функций покажет.
    Ясно.
    The Glass is Always Half Full! :mrgreen:
  • Who is online

    Users browsing this forum: No registered users and 3 guests