Важная информация

User Tag List

Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 21

Тема: SDCC релокация

  1. #1
    Master
    Регистрация
    27.01.2005
    Сообщений
    588
    Благодарностей: 309
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию SDCC релокация

    В своих страданиях на тему системности я дошел до перемещаемых библиотек. https://github.com/salextpuru/sdcc-n.../master/libsrc

    И тут меня ждало горькое разочарование.

    Интерфейс я продумал. Он работает. Но вот с таблицей релокации не получается.

    Суть в том, что sdldz80 (линкер) не выдаёт таблицу и я написал простой скрипт, который сравнивает два откомпилированных по разным адресам файла. Но плохое состоит в том, что SDCC часто генерирует код, где используются половинки адреса. И как с этим быть не знаю. Метод сравнения двух файлов не работает.

    То есть например, есть массив:

    _array: .ds 200

    И SDCC шпарит код навроде:

    ld l,# (_array & 0x0F)
    .......
    ld h,# (_array >> 8)

    Разумеется, сравнением двуж таблиц ни фина не сделать

    Как заставить линкер выдавать таблицу перемещений? Или как её вообще получить? Она получается не простой.
    Последний раз редактировалось SfS; 16.05.2018 в 14:40.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Moderator Аватар для Error404
    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,047
    Благодарностей: 1062
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SfS Посмотреть сообщение
    Как заставить линкер выдавать таблицу перемещений? Или как её вообще получить? Она получается не простой.
    Обычно линкер такое должен уметь. Но генерирует ту таблицу обычно не он, а ассемблер (он генерирует перемещаемый оттранслированный код), а линкер на основе кода и включенной в перемещаемый код таблицы перемещений уже транслирует на определенный адрес и опционально подтягивает и включает в код прочие аналогичные модули из библиотек. Я от SDCC отказался намного ранее, поэтому конкретными деталями о нем не владею. Но мысль - поискать опцию в ассемблере а не линкере. Например ассемблер М80 при указании ключа /L генерирует файл с листингом (*.PRN) где в конце файла содержится таблица с адресами и именами всех символов (которые зная исходный и требуемый адрес посадки кода легко по этой таблице откорректировать).
    Последний раз редактировалось Error404; 16.05.2018 в 15:32.
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  4. Этот пользователь поблагодарил Error404 за это полезное сообщение:
    SfS (16.05.2018)

  5. #3
    Master
    Регистрация
    27.01.2005
    Сообщений
    588
    Благодарностей: 309
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Обычно линкер такое должен уметь. Но генерирует ту таблицу обычно не он, а ассемблер (он генерирует перемещаемый оттранслированный код),
    Я наверное не ясно выразился. Ассемблер генерирует объектные файлы типа .rel. То есть "перемещаемые". А линкер соединяет эти объектные файлы воедино и привязывает к адресам.

    Таблица ассемблера мне ничего не даст, так как я не знаю какой из объектников как линкер распихает по памяти. Там же еще и секции есть.

    Мне же надо после загрузки в спек пересчитать адреса. Если все адреса хранятся как 16-битные - задача элементарно решается - сравнением двух файлов. (у меня один с адреса 0 линкуется, второй - с адреса 1).

    Но если компилятор использует половинки адреса отдельно - то всё.

  6. #4
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    2,522
    Благодарностей: 224
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    чем lst файл не нравится? все адреса там есть.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...

  7. #5
    Master
    Регистрация
    27.01.2005
    Сообщений
    588
    Благодарностей: 309
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    чем lst файл не нравится? все адреса там есть.
    Там только один исходник в lst файле. а мне надо для всего бинаря, в который входит несколько объектников плюс библиотеки.

    Мне нужна таблица символов, которую по сути линкер генерит внутри себя. Но наружу он её не показывает, сцука

  8. #6
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    2,522
    Благодарностей: 224
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    странно. всё что собирает сдцц, всё видно в лст файле. из библиотек, из рел файлов. все адреса собранные линкером там есть. если ты часть бинаря собираешь не в сдцц, смотри тамошний лст файл. в общем, не совсем понятно что нужно. проект собирается в сдцц полностью, значит всё будет в лст файле.
    Последний раз редактировалось Sayman; 16.05.2018 в 17:20.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...

  9. #7
    Master
    Регистрация
    27.01.2005
    Сообщений
    588
    Благодарностей: 309
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    странно. всё что собирает сдцц, всё видно в лст файле. из библиотек, из рел файлов. все адреса собранные линкером там есть. если ты часть бинаря собираешь не в сдцц, смотри тамошний лст файл. в общем, не совсем понятно что нужно. проект собирается в сдцц полностью, значит всё будет в лст файле.
    Есть несколько исходников и библиотек. Они скомпилированы в .rel и .lib файлы с помощью SDCC.
    Потом они линкуются в единый HEX с помощью sdld. ну и далее - в бинарь, но это несущественно.

    SDCC для каждого из файлов исходников создаёт отдельный .lst файл. В нём все адреса относительные. Можно линкеру сказать, чтобы он делал .rst файлы. Там адреса абсолютные. Но опять же - один файл .rst на один .c файл.

    Во-первых мне надо таблицу перемещений для всего бинарника.
    Во-вторых - библиотеки одновременно используются в разных бинарниках, компилируемых по разным адресам.

    Линкер, когда ведёт привязку кучи .rel и .lib знает как и что перемещать. Вопрос в том, как его заставить этим знанием поделиться в какой-то более-менее удобной форме.

    Я ж не руками всё это обрабатывать буду. Всё скриптами.

  10. #8
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    2,522
    Благодарностей: 224
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SfS Посмотреть сообщение
    SDCC для каждого из файлов исходников создаёт отдельный .lst файл. В нём все адреса относительные.
    блин, попутал меня бес, не лст файл, map файл. там абсолютные адреса. вот от туда я беру адрес нужных таблиц и процедур/функций, когда нужно что-то проверить и отладить. если исходников несколько, но линкуешь их потом одной строкой в один бинарь, там все адреса, таблицы и функции/процедуры будут, в одном файле. хоть 10 исходников подрубай.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...

  11. #9
    Master
    Регистрация
    27.01.2005
    Сообщений
    588
    Благодарностей: 309
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В мап-файл не пишутся объекты, которые static. То есть локальные, с областью видимости внутри С-файла.

    Я нашел временный выход. Если ограничиться тем, что все перемещаемые модули лежат с адреса кратного 256, то меняются только старшие байты. И всё чики-поки
    В принципе для модулей - более чем достаточно.

    тут https://github.com/salextpuru/sdcc-noinit всё лежит.

    Тест подгружаемого модуля - драйвера https://github.com/salextpuru/sdcc-n...pps/test-mm128
    Скрипты для генерации таблицы перемещений: https://github.com/salextpuru/sdcc-n...make_reloc_tbl
    Собственно библиотека с настраиваемым интерфейсом: https://github.com/salextpuru/sdcc-n...bsrc/libmemman

    Что получилось:
    1. Автоматическая генерация интерфейса к библиотеке на основе .h файла.
    2. Перемещаемый бинарь.
    3. маленькая часть библиотеки (вызовы), вкомпиливаемая в основную программу.

    Главное, что вся рутинная хрень по поводу генерации файлов - автоматизирована.

    Дальше хочу, чтобы можно было вызывать библиотеки раскиданные по разным страничкам с запоминанием откуда вызвано и куда вернуться.

  12. #10
    Master
    Регистрация
    27.01.2005
    Сообщений
    588
    Благодарностей: 309
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Видео. "Войны SDCC-NOINIT" https://hdd.tomsk.ru/file/rgxnkhlp

Страница 1 из 3 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. SDCC: Автоматизация
    от Sergey в разделе Программирование
    Ответов: 52
    Последнее: 11.08.2017, 18:53
  2. SDCC: библиотеки для ZX
    от Sergey в разделе Программирование
    Ответов: 10
    Последнее: 25.10.2015, 20:30
  3. Бага SDCC версии 3.3.0
    от TSL в разделе Программирование
    Ответов: 37
    Последнее: 20.04.2014, 16:31
  4. sdcc. с чего начать.
    от ALKO в разделе Программирование
    Ответов: 42
    Последнее: 16.09.2012, 14:49
  5. SDCC вокруг да около
    от andrews в разделе Программирование
    Ответов: 8
    Последнее: 26.03.2008, 09:16

Ваши права

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