Board.KolibriOS.org

Official KolibriOS board
It is currently Fri Apr 19, 2019 4:09 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 41 posts ]  Go to page Previous 1 2 3
Author Message
PostPosted: Sat May 27, 2017 12:45 pm 
Offline
User avatar

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

_________________
The Glass is Always Half Full! :mrgreen:


Top
   
PostPosted: Sat May 27, 2017 4:20 pm 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
punk_joker wrote:
только в параметры линковщика добавь параметр --subsystem native, если не ошибаюсь, иначе с запуском программы будет выскакивать окно консоли
Спасибо, очень помогло. :)

_________________
The Glass is Always Half Full! :mrgreen:


Top
   
PostPosted: Sat May 27, 2017 4:44 pm 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
Siemargl wrote:
вариант 2 - собирать с libc.dll.a (strip все= нужен)
Попробовал с libc.dll.a, и всё равно очень много - 74.2k. И это простая консольная программа, которая выводит на экран всего одну строчку. :shock:

Делал так:
Code:
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:


Top
   
PostPosted: Sat May 27, 2017 5:06 pm 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
Надо было ко всем ключам -lc добавить .dll. :)

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


Top
   
PostPosted: Sat May 27, 2017 6:02 pm 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 141
JohnXenox wrote:
Файл уменьшился, но всё равно давольно большой - 9.4k. :(

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


Top
   
PostPosted: Sat May 27, 2017 6:26 pm 
Offline

Joined: Mon Mar 27, 2006 6:33 am
Posts: 649
akron1 wrote:
И кроме того, исполняемые файлы в KolibriOS принято упаковывать, что практически сводит на нет разницу в размерах программ между ЯВУ и асмом.

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


Top
   
PostPosted: Sat May 27, 2017 6:42 pm 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
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:


Top
   
PostPosted: Sat May 27, 2017 6:59 pm 
Offline

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

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

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

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

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


Top
   
PostPosted: Sat May 27, 2017 8:13 pm 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
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:


Top
   
PostPosted: Sun May 28, 2017 12:15 am 
Offline

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

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

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

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


Top
   
PostPosted: Sun May 28, 2017 3:22 pm 
Offline
User avatar

Joined: Thu May 18, 2017 2:29 am
Posts: 170
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:


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 41 posts ]  Go to page Previous 1 2 3

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited