Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Пн окт 23, 2017 10:49 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 41 сообщение ]  На страницу Пред. 1 2 3
Автор Сообщение
СообщениеДобавлено: Сб май 27, 2017 12:45 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Siemargl писал(а):
перед objcopy надо делать strip - удаляет ненужную для отладки инфу
Флаг -g я убрал в kos32-gcc, поэтому удалять нечего. Всё равно попробовал применить разные ключи в kos32-ld и kos32-objcopy, и, как и ожидалось - никакого эффекта. :roll:
Siemargl писал(а):
вариант 2 - собирать с libc.dll.a (strip все= нужен)
Понятно, позже попробую. :)

_________________
The Glass is Always Half Full! :mrgreen:


Вернуться к началу
СообщениеДобавлено: Сб май 27, 2017 4:20 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
punk_joker писал(а):
только в параметры линковщика добавь параметр --subsystem native, если не ошибаюсь, иначе с запуском программы будет выскакивать окно консоли
Спасибо, очень помогло. :)

_________________
The Glass is Always Half Full! :mrgreen:


Вернуться к началу
СообщениеДобавлено: Сб май 27, 2017 4:44 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Siemargl писал(а):
вариант 2 - собирать с libc.dll.a (strip все= нужен)
Попробовал с libc.dll.a, и всё равно очень много - 74.2k. И это простая консольная программа, которая выводит на экран всего одну строчку. :shock:

Делал так:
Код:
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:


Вернуться к началу
СообщениеДобавлено: Сб май 27, 2017 5:06 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Надо было ко всем ключам -lc добавить .dll. :)

Теперь строка такая:
Код:
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:


Вернуться к началу
СообщениеДобавлено: Сб май 27, 2017 6:02 pm 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 83
JohnXenox писал(а):
Файл уменьшился, но всё равно давольно большой - 9.4k. :(

Так это неплохо. Компиляторы ЯВУ обычно добавляют в исполняемый файл служебный код ("ран-тайм"). Можно считать, что 9.4 Кб -- это константа, которая будет добавлена к любой программе. Если полезный размер программы 10 Кб, то "лишние" 9.4 Кб -- это много. Но для программы ~500 Кб +-10Кб несущественно. Часто ЯВУ сравнивают с ассемблером на примерах вроде "hello, world" и в этом случае разница получается значительной. Но для больших программ эта разница незаметна. Хороший компилятор может создать даже более плотный код. И кроме того, исполняемые файлы в KolibriOS принято упаковывать, что практически сводит на нет разницу в размерах программ между ЯВУ и асмом. Конечно, это справедливо для программ более сложных, чем "hello, world", но для этого и нужны ЯВУ.


Вернуться к началу
СообщениеДобавлено: Сб май 27, 2017 6:26 pm 
Не в сети

Зарегистрирован: Пн мар 27, 2006 6:33 am
Сообщения: 541
akron1 писал(а):
И кроме того, исполняемые файлы в KolibriOS принято упаковывать, что практически сводит на нет разницу в размерах программ между ЯВУ и асмом.

При упаковке Forth для KolibriOS размер системы уменьшился с примерно c 150Кб до примерно 24Кб и это при том, что в исполняемом файле
примерно больше половины размера занимает встроенный макрооптимизатор :)


Вернуться к началу
СообщениеДобавлено: Сб май 27, 2017 6:42 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
akron1 писал(а):
JohnXenox писал(а):
Файл уменьшился, но всё равно давольно большой - 9.4k. :(

Так это неплохо. Компиляторы ЯВУ обычно добавляют в исполняемый файл служебный код ("ран-тайм"). Можно считать, что 9.4 Кб -- это константа, которая будет добавлена к любой программе. Если полезный размер программы 10 Кб, то "лишние" 9.4 Кб -- это много. Но для программы ~500 Кб +-10Кб несущественно. Часто ЯВУ сравнивают с ассемблером на примерах вроде "hello, world" и в этом случае разница получается значительной. Но для больших программ эта разница незаметна. Хороший компилятор может создать даже более плотный код. И кроме того, исполняемые файлы в KolibriOS принято упаковывать, что практически сводит на нет разницу в размерах программ между ЯВУ и асмом. Конечно, это справедливо для программ более сложных, чем "hello, world", но для этого и нужны ЯВУ.
Понятно. Но всё равно, хочется поменьше. :(

Файл-то уменьшился, но теперь, не понятно почему он не запускается. Потом забросил в папку к файлу libc.dll, из папки kolibrios(из дистра), и так же ничего. :(

_________________
The Glass is Always Half Full! :mrgreen:


Вернуться к началу
СообщениеДобавлено: Сб май 27, 2017 6:59 pm 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 268
Вот 9.4к это нормально. У тебя наверное там используется printf() - это очень сложная и большая по коду функция.
Замени на puts(), или можно использовать функции из console.obj - там есть простой аналог
В случае libc.dll код конечно не там сильно уменьшится, но в случае статической линковки - да

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

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

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

и, конечно, она должна быть одной версии (практически) с libc.dll.a и dynamic.lds


Вернуться к началу
СообщениеДобавлено: Сб май 27, 2017 8:13 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Siemargl писал(а):
Вот 9.4к это нормально. У тебя наверное там используется printf() - это очень сложная и большая по коду функция.
Замени на puts(), или можно использовать функции из console.obj - там есть простой аналог
В случае libc.dll код конечно не там сильно уменьшится, но в случае статической линковки - да

Наверное всё - это минимальный предел бинарника для gcc5.4 (gcc4.8 давала чуть меньше)
Да printf(). Сейчас скомпилировал тот-же файл под Linux и там, исполняемый файл - 8.4k.
Siemargl писал(а):
если ты запускаешься с .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:


Вернуться к началу
СообщениеДобавлено: Вс май 28, 2017 12:15 am 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 268
Почему бинарник от gcc относительно большой - можно увидеть в map файле - там всегда есть С++ базовые вещи, вроде TLS и EH.
Я думаю, что это теоретически можно улучшить, но поможет это только хелловорлду и чистым С-программам, причем однопоточным.

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

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

Для трудных случаев есть mtdbg - прошагать хотя бы до старта _main() - он при наличии .map файла символы функций покажет.


Вернуться к началу
СообщениеДобавлено: Вс май 28, 2017 3:22 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 18, 2017 2:29 am
Сообщения: 66
Siemargl писал(а):
Почему бинарник от gcc относительно большой - можно увидеть в map файле - там всегда есть С++ базовые вещи, вроде TLS и EH.
Я думаю, что это теоретически можно улучшить, но поможет это только хелловорлду и чистым С-программам, причем однопоточным.

Так что не первой необходимости, для минимальных программ есть ассемблер (оверхед 32 байта заголовка), c-- (32), и tcc (1Кб если только не трогать printf!)
Ясно.
Siemargl писал(а):
Про запуск - проверяй наличие /kolibrios/lib/libc.dll и версий. Можешь попробовать пересобрать newllib
Нет, всё оказалось намного проще. Я просто забыл дописать ключь "--image-base 0" в командную строку. Теперь программа работает. :mrgreen:

Siemargl писал(а):
Для трудных случаев есть mtdbg - прошагать хотя бы до старта _main() - он при наличии .map файла символы функций покажет.
Ясно.

_________________
The Glass is Always Half Full! :mrgreen:


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 41 сообщение ]  На страницу Пред. 1 2 3

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB