Board.KolibriOS.org

Official KolibriOS board
It is currently Mon May 27, 2019 12:41 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 58 posts ]  Go to page Previous 1 2 3 4 Next
Author Message
 Post subject: Re: gcc и kolibri
PostPosted: Sat Feb 06, 2016 7:41 am 
Offline

Joined: Fri Feb 05, 2016 2:24 pm
Posts: 4
Перекомпилировал kos32-gcc, компиляция прошла нормально. А с линковщиком опять:
Code:
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 несколько раз пытался по разному указывать, безрезультатно).


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Tue Mar 08, 2016 11:43 pm 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
Поломался тулчайн 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

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


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Wed Mar 09, 2016 12:10 am 
Offline
Kernel Developer

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


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Wed Mar 09, 2016 12:58 am 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
libgcc.a я не нашел ни в каком виде, ни в исходниках, ни в lib. Посчитал, что -lgcc_eh - ее замена с поддержкой исключений

пишет что то про формат
Spoiler: Show
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'


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Wed Mar 09, 2016 6:40 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Quote:
libgcc.a я не нашел ни в каком виде, ни в исходниках, ни в lib
Потому, что это часть компилятора и включена в тулчейн.
Quote:
пишет что то про формат
Не удивительно, потому, что файл должен компилироваться gcc.


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Wed Mar 09, 2016 12:28 pm 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
Serge wrote:
Quote:
libgcc.a я не нашел ни в каком виде, ни в исходниках, ни в lib
Потому, что это часть компилятора и включена в тулчейн.

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

внутри компилятора тоже не находится
Spoiler: Show
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 wrote:
Quote:
пишет что то про формат
Не удивительно, потому, что файл должен компилироваться gcc.

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

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

Spoiler: Show
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

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


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Wed Mar 09, 2016 6:47 pm 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1148
Варианта два, скомпилировать библиотеки самому, или же скачать http://ftp.kolibrios.org/users/Serge/ne ... 7_11_14.7z

_________________
я лишь учусь


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Wed Mar 09, 2016 11:35 pm 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
1. libgcc.a действительно, нашелся - валялся внутри каталога компилятора, только не в путях поиска библиотек
Пришлось скопировать ручками

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

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

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



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

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

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

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


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Thu Mar 10, 2016 1:22 am 
Offline
Kernel Developer

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


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Thu Mar 10, 2016 2:07 am 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1148
Serge wrote:
Это проблема не fopen, а файловых менеджеров Kolibri.

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

_________________
я лишь учусь


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Thu Mar 10, 2016 2:19 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Spoiler: Show
Attachment:
kos++.png
kos++.png [ 71 KiB | Viewed 3509 times ]


Attachments:
kos++.7z [69.75 KiB]
Downloaded 117 times
Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Thu Mar 10, 2016 2:29 am 
Offline
Kernel Developer

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


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Thu Mar 10, 2016 4:46 am 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
Подтверждаю. Проблема была в замещенном __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


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Fri Apr 08, 2016 12:22 am 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
Используем опцию 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) ?


Top
   
 Post subject: Re: gcc и kolibri
PostPosted: Tue Apr 12, 2016 2:00 am 
Offline

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

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

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

--- ENGLISH ---
Spoiler: Show
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


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


Attachments:
ssp.c [3.21 KiB]
Downloaded 108 times
Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 58 posts ]  Go to page Previous 1 2 3 4 Next

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