Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Ср ноя 22, 2017 2:09 am

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




Начать новую тему  Ответить на тему  [ 46 сообщений ]  На страницу Пред. 1 2 3 4 След.
Автор Сообщение
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Сб фев 06, 2016 7:41 am 
Не в сети

Зарегистрирован: Пт фев 05, 2016 2:24 pm
Сообщения: 4
Перекомпилировал kos32-gcc, компиляция прошла нормально. А с линковщиком опять:
Код:
kos32-ld.exe -LD:\src\newlib\lib -LC:\TDM-GCC-64\lib\gcc\x86_64-w64-mingw32\5.1.0\32 -o helllo-world.exe D:\src\kos-hello-world\.objs\main.o  -s -nostdlib -n --file-alignment=16 --section-alignment=16 -TD:\src\newlib\app.lds --image-base 0 -i386pe  -lgcc -lapp -lc.dll
kos32-ld.exe: bad -rpath option

Ясно, что ему что-то не то передаётся, но я со своими скудными знаниями никак не разберусь (rpath несколько раз пытался по разному указывать, безрезультатно).


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Вт мар 08, 2016 11:43 pm 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 269
Поломался тулчайн GCC (от serge). По крайней мере под Win32

1. На SVN в LIB нет библиотек Libc для статической линковки.

2. Пересобрать newlib не получается - не компилируется crt\setjmp.s
Я в гнусном ассемблере никак.

3. При динамической линковке недостача объектника __main
$(LD) $(LDFLAGS) $(LIBPATH) -o hello $(OBJECTS) -lc.dll -lapp -lgcc_eh
Так и не понял, кто функцию требует, тем не менее при созданной заглушке helloworld работает

4. Нет собранной stdlib++. Она собирается, но при линковке с ней не хватает уже прилично функций
__main - аналогичная проблема,
getc - сделан макросом а библиотека хочет функцию,
__umoddi3 и __udivdi3 - это генерируется при операциях с long long но реализации нет,
strxfrm - не реализована

Хотя эти функции и не вызываются, но cout << "helloworld" не работает

линковка
$(LD) $(LDFLAGS) $(LIBPATH) -o hello $(OBJECTS) -lstdc++ -lsupc++ -lgcc_eh -lc.dll -lapp

что посоветуете?


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Ср мар 09, 2016 12:10 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Siemargl
Надо добавить -lgcc, потому и не линкуется. Порядок библиотек тоже имеет значение.
Цитата:
2. Пересобрать newlib не получается - не компилируется crt\setjmp.s
Я в гнусном ассемблере никак.
Что пишет ?


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Ср мар 09, 2016 12:58 am 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 269
libgcc.a я не нашел ни в каком виде, ни в исходниках, ни в lib. Посчитал, что -lgcc_eh - ее замена с поддержкой исключений

пишет что то про формат
Спойлер: Показать
as -o crt/setjmp.o crt/setjmp.s
crt/setjmp.S: Assembler messages:
crt/setjmp.S:27: Error: junk at end of line, first unrecognized character is `('

crt/setjmp.S:28: Error: junk at end of line, first unrecognized character is `('

crt/setjmp.S:29: Error: invalid character '(' in mnemonic
crt/setjmp.S:30: Error: invalid character '(' in mnemonic
crt/setjmp.S:34: Error: no such instruction: `sym (setjmp):'
crt/setjmp.S:37: Error: too many memory references for `mov'
crt/setjmp.S:40: Error: junk `(ebp)' after expression
crt/setjmp.S:40: Error: too many memory references for `mov'
crt/setjmp.S:42: Error: too many memory references for `mov'
crt/setjmp.S:43: Error: too many memory references for `mov'
crt/setjmp.S:44: Error: too many memory references for `mov'
crt/setjmp.S:45: Error: too many memory references for `mov'
crt/setjmp.S:46: Error: too many memory references for `mov'
crt/setjmp.S:48: Error: junk `(ebp)' after expression
crt/setjmp.S:48: Error: too many memory references for `mov'
crt/setjmp.S:49: Error: too many memory references for `mov'
crt/setjmp.S:51: Error: junk `(ebp)' after expression
crt/setjmp.S:51: Error: too many memory references for `mov'


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Ср мар 09, 2016 6:40 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Цитата:
libgcc.a я не нашел ни в каком виде, ни в исходниках, ни в lib
Потому, что это часть компилятора и включена в тулчейн.
Цитата:
пишет что то про формат
Не удивительно, потому, что файл должен компилироваться gcc.


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Ср мар 09, 2016 12:28 pm 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 269
Serge писал(а):
Цитата:
libgcc.a я не нашел ни в каком виде, ни в исходниках, ни в lib
Потому, что это часть компилятора и включена в тулчейн.

svn co svn://kolibrios.org/contrib/toolchain toolchain <- тут не наблюдается нужных функций

внутри компилятора тоже не находится
Спойлер: Показать
D:\VSProjects\msys-kos32-4.8.2\hello>\bin\mingw32-make.exe -f Makefile.shared
kos32-gcc -c -fno-ident -O2 -fomit-frame-pointer -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -I D:/VSProjects/msys-kos32-4.8.2/sdk/sources/newlib/libc/include -o hello.o hello.c
kos32-ld -static -S -nostdlib -T D:/VSProjects/msys-kos32-4.8.2/sdk/sources/newlib/app.lds --image-base 0 -L D:/VSProjects/msys-kos32-4.8.2/sdk/lib/static -L /home/autobuild/tools/win32/mingw32/lib -o hello hello.o -lc.dll -lapp -lgcc_eh -lgcc
kos32-ld: cannot find -lgcc
mingw32-make: *** [hello] Error 1


Serge писал(а):
Цитата:
пишет что то про формат
Не удивительно, потому, что файл должен компилироваться gcc.

Вечером гляну поправить makefile

Единственное, я ручками с соурфорджа докачивал недостающие dll для тулчейна

Спойлер: Показать
libcharset-1.dll
libgcc_s_dw2-1.dll
libgmp-10.dll
libiconv-2.dll
libintl-8.dll
libmpc-3.dll
libmpfr-4.dll
zlib1.dll

mingw32-make.exe тоже приблудный
D:\VSProjects\msys-kos32-4.8.2\win32>mingw32-make.exe --version
GNU Make 3.82

Но думаю на кодогенерацию это не влияет


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Ср мар 09, 2016 6:47 pm 
Не в сети

Зарегистрирован: Вт апр 12, 2011 11:19 pm
Сообщения: 1077
Варианта два, скомпилировать библиотеки самому, или же скачать http://ftp.kolibrios.org/users/Serge/ne ... 7_11_14.7z

_________________
я лишь учусь


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Ср мар 09, 2016 11:35 pm 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 269
1. libgcc.a действительно, нашелся - валялся внутри каталога компилятора, только не в путях поиска библиотек
Пришлось скопировать ручками

2. Правка makefile для компиляции .S с помощью gcc помогла собраться Libc

Итого С-программы работают, причем получаются компактными.

Правда, на чуть более сложной программке обнаружилось пару мелких багов в CRT
Спойлер: Показать
-fopen не знает про текущий каталог запуска программы - нужно указать полный путь
-clock()/CLOCKS_PER_SEC выдает несоответствующие значения



После догрузки необходимых unixtools даже удалось собрать и stdlibc++

Для __main, getc, strxfrm - поставлены заглушки.
__main раньше существовала как пустышка в crt3.c, но почему то была удалена. Она вызывается компилятором при старте main().
Остальные пока не вызываются.

Тем не менее, на обычной
cout << "Hello C++ world!" << endl;
вылетает.

Отладчик показал, что внутри ostream-inst.cc передается нулевой указатель.
Нужно смотреть с отладочной версией библиотеки. Позже гляну, возможно требуется явно инициализировать cout,


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Чт мар 10, 2016 1:22 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Цитата:
1. libgcc.a действительно, нашелся - валялся внутри каталога компилятора, только не в путях поиска библиотек
У остальных таких проблем не возникает. Это намекает на то, что сперва тулчейн надо корректно установить.
Цитата:
-fopen не знает про текущий каталог запуска программы - нужно указать полный путь
Это проблема не fopen, а файловых менеджеров Kolibri. Рекомендую запускать из Shell.
__main находится в libgcc. Эта функция вызывает конструкторы статических объектов. Ставить на ней заглушку facepalm


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Чт мар 10, 2016 2:07 am 
Не в сети

Зарегистрирован: Вт апр 12, 2011 11:19 pm
Сообщения: 1077
Serge писал(а):
Это проблема не fopen, а файловых менеджеров Kolibri.

Необходимо перед запускам сменить рабочую директорию на директорию с которой запускается программа?

_________________
я лишь учусь


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Чт мар 10, 2016 2:19 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Спойлер: Показать
Вложение:
kos++.png
kos++.png [ 71 КБ | 1698 просмотров ]


Вложения:
kos++.7z [69.75 КБ]
37 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Чт мар 10, 2016 2:29 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Цитата:
Необходимо перед запускам сменить рабочую директорию на директорию с которой запускается программа?
Нет, процессы наследуют рабочий каталог родителя. Только разработчики файловых менеджеров об этом забыли. А файловые функции используют рабочий каталог, если не указан полный путь. В результате если запустить shell и выполнить
cd /kolibrios
test
то рабочим каталогом test будет /kolibrios, а точнее примонтированная директория.
А если запустить test в kfar рабочим каталогом скорее всего будет /rd/1


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Чт мар 10, 2016 4:46 am 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 269
Подтверждаю. Проблема была в замещенном __main().
Также подтверждаю, что из командной строки текущий каталог в fopen корректный.

Со статически слинкованной libc запускается. Но бинарник получился больше ~118Кб после KPack и 375k неупакованный

Попробовал для уменьшения, чтобы сошлось размером с serge, слинковать с динамической clib.dll - не запускается.
$(LD) $(LDFLAGS) $(LIBPATH) -o hellocpp $(OBJECTS) -lstdc++ -lsupc++ -lgcc_eh -lc.dll -lapp -lgcc
clib.dll Положил рядом с программой.

Или я не так собрал или clib.dll должен быть именно в системном rd/1/lib?

Надо повспоминать и задокументировать ньюансы тулчейна с mingw. Их снаружи не всегда видно, но системщики должны знать:
-он загадочным образом ищет свои (дефолтные) хидеры и библиотеки внутри своего подкаталога
-своеобразно генерирует код - 64-int операции, инициализация статических [только ли?] объектов, исключения
-важен порядок указания библиотек при линковке
-линкер не предупреждает о дублирующихся символах
-не всегда корректно обрабатываются перенаправление ввода-вывода у утилит
-в newlib stderr выводит сообщения не на консоль, а на системную доску отладки. perror() тоже
-часть функций clib реализованы как intrinsic
-чтобы не создавался еще один процесс с консольным окном для граф проги нужно добавить линкеру: LDFLAGS+= --subsystem windows


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Пт апр 08, 2016 12:22 am 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 269
Используем опцию gcc -fstack-protector

Получаем что
**(.text+0x322): undefined reference to `__stack_chk_guard'
**(.text+0x32f): undefined reference to `__stack_chk_fail'

1.Будет реализовываться libssp?

Заглушка реализована. Не срабатывала из-за проблемы с порядком либ в линкере.

вопрос возник в связи с поиском странной ошибки, которая проявляется при включении -О2

Прикрутил себе пока ssp.c из исходников gcc, чуть порезав.

2.Есть ли в ОС возможность получить stack trace ?

3.Работает ли вообще signal(SIGSEGV) ?


Вернуться к началу
 Заголовок сообщения: Re: gcc и kolibri
СообщениеДобавлено: Вт апр 12, 2016 2:00 am 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 269
Выкладываю урезанный контроль стека. Описание
---Русский---
Спойлер: Показать
Используя продвинутые методики, GCC свободно адресует регистр SP вместо BP для адресации.
Если использовать неверный вызов ассемблерной функции, которые обычно используются в KolibriOS, стек будет несбалансирован.
Если при отладочном режиме адресуется стандратный стек фрейм через BP, то в релизной версии ошибки возникнут даже при обращении к локальным переменным. Чтобы помочь отслеживать такие ситуации, необходимо использовать опции компилятора -fstack-protector-all или -fstack-protector.

Линкеру необходимо добавить в список ssp.o

Исходный код ssp.c прилагается, он должен компилироваться без -fstack-protector

--- ENGLISH ---
Спойлер: Показать
Using advanced techniques, GCC free address register SP instead of BP to address.
If you use the wrong call an assembly function that are commonly used in KolibriOS, the stack will be imbalanced.
If debug mode is addressed standratny stack frame by BP, in the release version of any error even when accessing local variables. To help keep track of such situations, you need to use the compiler option -fstack-protector-all or -fstack-protector.

To linker list must be added ssp.o

Ssp.c source code is included, it should compile without -fstack-protector


При определении порчи стека, программа завершится аварийно с выдачей сообщения на доску отладки. Если конечно не произойдет нарушения защиты до выхода из функции.


Вложения:
ssp.c [3.21 КБ]
33 скачивания
Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 46 сообщений ]  На страницу Пред. 1 2 3 4 След.

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


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

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


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

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