Добрый день.
Уже достало мучится с этим Гринхилсом.
Существует достаточно большой проект для MIPS написаный на С. Изначально писался под компилятор GNU sde toolchain, соответственно были написаны скрипты компилятору и линкеру. Все нормально компилируется и линкуется. Но встала необходимость (рассматривается возможность на самом деле) перейти на другой компилятор, например МУЛЬТИ (под МИПС больше ничем особо не пахнет).
И вот вроде бы перенес все настроики компилятора, все вроде бы компилится, дело за малым - линковка . И вот тут проблему никак не удается решить. Создаю свой файл дириктив линкеру, прописываю там области памяти и секции (то как он парсит этотт файл - отдельная история ):
Да, GHS довольно своеобразная среда..
Я к ней привыкнуть не смог, пользуюсть отдельными утилитами. Только отладчик запускаю из-под среды.
Просмотри файлы проекта (default.gpj, *.gpj) скорее всего там и найдешь проблему.
В оконцовке у меня это выглядит примерно так:
1. Батник для запуска компилятора -
......
D:\Dev\GHS\mips407\gbuild.exe -all default.gpj
.......
default.gpj - файл "проекта" -
#!gbuild
primaryTarget=mips_standalone.tgt
[Project]
-bsp generic <<< здесь глобальные настройки компилятора
-G
-object_dir=objs
-wantprototype
-cpu=rc32364
-littleendian
default.con
src\hello.gpj [Program]
src\resource.gpj [Project]
Если настройки компилятора разные для разных файлов, то оформляется ввиде "подпроектов" с индивидуальными настройками внутри.
Соответственно, hello.gpj и resource.gpj - файлы:
#!gbuild
[Program]
hello.c <<< исходники добавляю свои, как мне нужно
dmatest.c
tdm.c
eth.c
DspIf.c
standalone_ram.ld <<< файлик для линкера - я имя его не менял, потроха поправил и все.
resource.gpj - не разбирался, зачем этот файл, поэтому оставил все как было.
#!gbuild
[Project]
resource_readme.txt
standalone_ram.ld
Ну и все практически
В standalone_ram.ld правишь что тебе нужно, прикручиваешь свою любимую среду и вперед!
Кстати, хелп у GHS не плохой, много полезных фич можно вычитать.
Бинарник... не помню, по моему не заморачиваясь на разборки с линкерными ключами - конвертировал из ELF - да он не очень мне нужен был.
А Вообще - Build options - Linker - Generate additional output.
Creates the specified output type in addition to the project executable. Permitted settings
for this option are:
<> Memory Image File (-memory) – Generates output file with .mem extension containing the output of the image as translated by the gmemfile utility program. For more information about gmemfile, see "The gmemfile Utility Program" in the MULTI: Building Applications book for your target.
Вроде то, что тебе нужно. По виду - честный образ памяти.
<> S-Record File (-srec) – Generates output file with .run extension
containing the output of the image as translated by the gsrec utility program. For more information about gsrec, see "The gsrec Utility Program" in the MULTI: Building Applications book for your target.
<> None (--no_additional_output) : [default]
Спасибо. Разобрался теперь.
По ходу дела возник еще один вопрос с линкером.
Предположим есть написанная на С функция, которая хранится в одном с файле. Я могу скомпилировать этот файл с помощью например gcc (хотя и не обязательно) и получить объектник (установив директиву -с компилятора). Далее предположим я этот объектник хочу подключить к другой программе, которая вообще делается в другой среде и под другим компилятором.
Так вот проблемма заключается в следующем. В этой С функции я использую библиотеку math <math.h>, для вычисления мат. функций. Когда я подключаю мой файл к программе, то все линкуется, ошибок не выдает, функция вызывается, но как только в этой моей функции происходит вызов матиматической функции из math.h проц переходит по какому то адресу где одни nop.
Насколько я понимаю математическая функция, которую я вызываю никак не включается в код объектника (что естественно), а для нее есть свой объектник, где то в стандартных библиотеках. Но как мне его этот математический объектник "взять с собой" в новый проект???? Надеюсь я ясно выразился.
Спасибо
Ну а впрямую сказать линкеру "линкуй либу ХХХ" ?
Поискать имя функции в библиотеках можно, имена там есть.
А вот возможность линковки обьектников сделаных из-под разных компиляторов.... не знаю, ни разу так не делал..... Что-то мне думается шансов мало...
>Так а какую либу???
Во всех либах присутствуют имена функций. Так что, есть шанс найти нужную либу по содержанию в ней нужного тебе имени функции.
> Я расчитываю на то, что свой файл (сишный с вызовом мат функции)
> я отдам условно говоря покупателю, а он пусть линкует его с чем хочет.
Не, ну если исходники отдаешь - какие проблемы?
>>А вот возможность линковки обьектников сделаных из-под разных компиляторов....
>>не знаю, ни разу так не делал..... Что-то мне думается шансов мало...
>Должно быть нормально, так как формат объектника стандартный - ELF.
>По крайней мере для GNU и MULTI. Линкер не ругается, и нормально вызывает мою функцию,
>только при вызове мат функции внутри моей идет чер знает куда.
>Если в моей функции отменить выхов сторонней мат функции, то все ОК.
По моему дело не в формате обьектника, а в наборе библиотек, который использовался.
Вот здесь и сомнения в совместимости.
Не, не знаю. Никогда так не делал.
Вообще, ситуация странная в том смысле, что мат функция отсутствует в памяти.
Может выбраны не те опции для процессора? (типа наличия мат сопроцессора, разрядности, еще чего-нибудь?)
Или условная компиляция где-то затесалась и требует каких-то параметров?
Попробуй в math.h перед вызываемой тобой функцией поставить #error "xxxx" - пройдет или нет?
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)