-
- ПОБЕДА! Подробности Aleksey_75(682 знак., 18.09.2020 22:49)
- Фигня полная. В памяти могут быть релоцируемые полуслова, например.
Или хуже того, что-то такое, у чего выравнивание зависит от адреса.
Т.е. условно легло оно на границу кратную 256 -- так и лежит. А
если положили на не кратную -- самоподтягивается вверх до кратной
256. Что будешь делать? Я конечно понимаю, что компилятор генерит
меньшее многообразие, чем позволяет ассемблер, но не полагался
бы... Потому набор релокаций для динамических библиотек сильно уже,
чем для fk0(34 знак., 18.09.2020 23:41)
- не очень понимаю "А если положили на не кратную " я все го лишь
меняю адреса .... За эти дни я физически перелопатил все возможные
вариант и сделал вывод что все сводится к подмене адресов! в общем
посмотрим! в логгер добавил события, будем посмотреть ! - Aleksey_75(18.09.2020 23:50)
- ELF в конечном счёте состоит из секций, в которых лежат
переменные-объекты или функции кода. И объектный файл тоже из таких
секций. А дальше начинаются приключения. Объекты сложенные в секцию
.data могут иметь условие выравнивания на какую-то границу. Сами
секции тоже. Функции должны быть выравнены на границу из 16 байт
(так может требовать ABI -- иначе что-нибудь поломается в коде, сам
процессор-то исполнять конечно не перестанет). И пока оно всё
внутри объектных файлов -- fk0(1583 знак., 19.09.2020 00:11)
- выравниванием занимается линкер о чем прямо говорит ! один ни тоже код с разными адресами (естественно кратными 4) никуда сьехать физически не может! Aleksey_75(1587 знак., 19.09.2020 00:20)
- ELF в конечном счёте состоит из секций, в которых лежат
переменные-объекты или функции кода. И объектный файл тоже из таких
секций. А дальше начинаются приключения. Объекты сложенные в секцию
.data могут иметь условие выравнивания на какую-то границу. Сами
секции тоже. Функции должны быть выравнены на границу из 16 байт
(так может требовать ABI -- иначе что-нибудь поломается в коде, сам
процессор-то исполнять конечно не перестанет). И пока оно всё
внутри объектных файлов -- fk0(1583 знак., 19.09.2020 00:11)
- не очень понимаю "А если положили на не кратную " я все го лишь
меняю адреса .... За эти дни я физически перелопатил все возможные
вариант и сделал вывод что все сводится к подмене адресов! в общем
посмотрим! в логгер добавил события, будем посмотреть ! - Aleksey_75(18.09.2020 23:50)
- При помощи лома и какой-то матери :-) - SciFi(18.09.2020 22:57)
- Угу! Но мне нужно было само понимание, я его получил! Описаний на
этот счет фактически нету! - Aleksey_75(18.09.2020 23:02)
- Такая методика широко известна, для тех кто сталкивался с 8-битными
игрушками прибитыми к полу. Но так же известно, что она
малоприменима на практике. Ещё доисторический M80 в CP/M умел
генерировать таблицу релокаций, причём лучше (чем вот так)...
Вообще я не совсем понимаю, как ты сможешь разделить .text и .data,
в смысле избавиться от фиксированного смещения между ними.
Допустим, ты по адресу понял, что относится к .text, что к .data и
при загрузке каждый сегмент fk0(522 знак., 18.09.2020 23:52, ссылка, ссылка)
- в бинарнике нет никаких смещений! есть абсолютные адреса! Aleksey_75(110 знак., 19.09.2020 00:00, картинка)
- Ответь для себя на простой вопрос: что случится с указателями на
функции (в месте где они переменной присваиваются), и что случится
в варианте, когда у тебя адрес переменной в коде загружается как
непосредственное значение, но не через LDR, а парой MOV Rn, #imm16
и MOVT Rn, #imm16. - fk0(19.09.2020 00:14)
- Я не изобретаю серебряную пулю! в моем случае подобное в модулях
недопустимо! Хотя и в общем случае , присваивать указатель на
функцию значением идея так себе! - Aleksey_75(19.09.2020 00:24)
- Oh my... А машины состояния как писать? lloyd(62 знак., 19.09.2020 10:44)
- Я не изобретаю серебряную пулю! в моем случае подобное в модулях
недопустимо! Хотя и в общем случае , присваивать указатель на
функцию значением идея так себе! - Aleksey_75(19.09.2020 00:24)
- Ответь для себя на простой вопрос: что случится с указателями на
функции (в месте где они переменной присваиваются), и что случится
в варианте, когда у тебя адрес переменной в коде загружается как
непосредственное значение, но не через LDR, а парой MOV Rn, #imm16
и MOVT Rn, #imm16. - fk0(19.09.2020 00:14)
- в бинарнике нет никаких смещений! есть абсолютные адреса! Aleksey_75(110 знак., 19.09.2020 00:00, картинка)
- Такая методика широко известна, для тех кто сталкивался с 8-битными
игрушками прибитыми к полу. Но так же известно, что она
малоприменима на практике. Ещё доисторический M80 в CP/M умел
генерировать таблицу релокаций, причём лучше (чем вот так)...
Вообще я не совсем понимаю, как ты сможешь разделить .text и .data,
в смысле избавиться от фиксированного смещения между ними.
Допустим, ты по адресу понял, что относится к .text, что к .data и
при загрузке каждый сегмент fk0(522 знак., 18.09.2020 23:52, ссылка, ссылка)
- Угу! Но мне нужно было само понимание, я его получил! Описаний на
этот счет фактически нету! - Aleksey_75(18.09.2020 23:02)
- Фигня полная. В памяти могут быть релоцируемые полуслова, например.
Или хуже того, что-то такое, у чего выравнивание зависит от адреса.
Т.е. условно легло оно на границу кратную 256 -- так и лежит. А
если положили на не кратную -- самоподтягивается вверх до кратной
256. Что будешь делать? Я конечно понимаю, что компилятор генерит
меньшее многообразие, чем позволяет ассемблер, но не полагался
бы... Потому набор релокаций для динамических библиотек сильно уже,
чем для fk0(34 знак., 18.09.2020 23:41)
- У мну вопрос! либо действительно никто подобным не занимался?? или
просто заподло дать волшебного пенделя в правильном направлении ? - Aleksey_75(17.09.2020 23:12)
- По ссылке человек просто по старинке решает подобный вопрос :) - Ozelot(18.09.2020 08:18, ссылка)
- Тебе уже дали все ответы. Занимался чем? Если речь про ARMCC, то
стоит им написать в поддержку и напрямую обрисовать задачу и
попросить рекомендаий по её решению. Если продукт ворованный, то не
стоит сношать мозг, а взять бесплатный GCC. - fk0(18.09.2020 00:12)
- ок! по GCC можно показать решение с примерами ? Дело не в кейле, я
с удовольствием переползу куда угодно, но для начала нужно
понимание что вопрос будет решен! судя по активности и гуглю, тема
очень скользкая и не факт что с GCC все будет хорошо! - Aleksey_75(18.09.2020 00:18)
- В любом компе с линуксом загружаются динамические библиотеки
скомпилированные GCC. Я сам вручную загружал, правда на MIPS. Но не
велика разница. - fk0(18.09.2020 00:27)
- у мну совсем не комп и совсем не линух .... у мну скромный мк с 64к
озу и 128к флеши! это как бе разные вещи - Aleksey_75(18.09.2020 00:30)
- Нет разницы. Линукс тут не нужен. Динамическую библиотеку загрузить
относительно просто. Для твоего случая уже все детали разжёваны.
Вот с этими опциями собираешь (ещё -shared) в ELF, который
"загружаешь" путём копирования .text куда надо и .data куда
получается. Речь не про секции, а про програмные хедеры -- см.
readelf -a (внутри которых .text и .data). Вообще нужно ли тебе
копировать во flash, может проще в ОЗУ и оттуда запускать? Так
проще (не нужны тогда fk0(69 знак., 18.09.2020 00:35, ссылка)
- опять беспредметный разговор! про не грузить в флешь а работать из
озу совсем смешно! у меня сейчас с фиксироваными адресами на каждый
модуль выделено 256 байт озу и все впритык с основной логикой, этот
вариант я даже не рассматриваю - Aleksey_75(18.09.2020 00:39)
- Что тут беспредметного? За тебя код написать? Что смешного я тоже не понимаю, у первых юниксов было 64кБайта и как-то крутились. Проблема, догадываюсь, в том что "программисты проф. уровня" знают страшное слово "фрагментация" и не используют динамический аллокатор памяти, поэтому у них всё в compile time распределено (когда оно надо, и когда не надо) в итоге нужны титанические объёмы ОЗУ. Тебе уже готовую ссылку на ELF-лоадер давали. Брать как есть не надо, но подсмотреть fk0(224 знак., 18.09.2020 00:46)
- опять беспредметный разговор! про не грузить в флешь а работать из
озу совсем смешно! у меня сейчас с фиксироваными адресами на каждый
модуль выделено 256 байт озу и все впритык с основной логикой, этот
вариант я даже не рассматриваю - Aleksey_75(18.09.2020 00:39)
- Нет разницы. Линукс тут не нужен. Динамическую библиотеку загрузить
относительно просто. Для твоего случая уже все детали разжёваны.
Вот с этими опциями собираешь (ещё -shared) в ELF, который
"загружаешь" путём копирования .text куда надо и .data куда
получается. Речь не про секции, а про програмные хедеры -- см.
readelf -a (внутри которых .text и .data). Вообще нужно ли тебе
копировать во flash, может проще в ОЗУ и оттуда запускать? Так
проще (не нужны тогда fk0(69 знак., 18.09.2020 00:35, ссылка)
- у мну совсем не комп и совсем не линух .... у мну скромный мк с 64к
озу и 128к флеши! это как бе разные вещи - Aleksey_75(18.09.2020 00:30)
- В любом компе с линуксом загружаются динамические библиотеки
скомпилированные GCC. Я сам вручную загружал, правда на MIPS. Но не
велика разница. - fk0(18.09.2020 00:27)
- ок! по GCC можно показать решение с примерами ? Дело не в кейле, я
с удовольствием переползу куда угодно, но для начала нужно
понимание что вопрос будет решен! судя по активности и гуглю, тема
очень скользкая и не факт что с GCC все будет хорошо! - Aleksey_75(18.09.2020 00:18)
- Докладываюсь! Времени сегодня на это не было , пару часиков
поковырял! вроде все понятно , не очень понятно (точнее совсем не
понятно!) по двум Aleksey_75(240 знак., 17.09.2020 12:17, картинка)
UPD не два слова а четыре. 80h-90h это адреса смещения для областей RO XO RW ZI вычисляется ADR RAM - ADR FLASH +- VAR (пока не могу понять что это, размеры областей не совпадают)- Aleksey_75(17.09.2020 19:36)- Неправильно! это указатели на переменные используемые в модуле! - Aleksey_75(17.09.2020 19:37)
- Офигенно. Не думал, что доживу до 2020 года и увижу
реверс-инженеринг буржуйского софта. Повеяло 90-ми. Как из душа
окатило. - SciFi(17.09.2020 19:51)
- ))) это не бургжуйский софт , это бинарник stm. Скрывают доки суки!
по переносу указателей используемых в модуле все понятно и даже
работает! а вот с локальными переменными жопе! по ссылке пишуть
надо вызвать __arm_relocate_pie_ но что это за хня и где её искать
умалчивают! Aleksey_75(3 знак., 17.09.2020 19:56, ссылка)
- Я тебе сказал, дьявол в мелочах, и такие темы средним разработчиком
без прямой конкретной документации -- не подъёмны. И экономически
не целесообразны. До конца ты не разгребёшь и зашьёшься на том, что
"в поле" начнутся магические вылеты. - fk0(18.09.2020 00:14)
- отчасти согласен, отчасти нет! Вопрос в другом! есть задача, её необходимо решить, вопрос как !? - Aleksey_75(18.09.2020 00:20)
- Судя по эта функция должна в стартапе библиотечном быть, поэтому не
расписывают. Andreas(188 знак., 17.09.2020 20:18, ссылка)
- в стартапе нету! Ссылку видел, но там под AEMv8-A возможно там и есть, в моем нету - Aleksey_75(17.09.2020 20:32)
- Я тебе сказал, дьявол в мелочах, и такие темы средним разработчиком
без прямой конкретной документации -- не подъёмны. И экономически
не целесообразны. До конца ты не разгребёшь и зашьёшься на том, что
"в поле" начнутся магические вылеты. - fk0(18.09.2020 00:14)
- ))) это не бургжуйский софт , это бинарник stm. Скрывают доки суки!
по переносу указателей используемых в модуле все понятно и даже
работает! а вот с локальными переменными жопе! по ссылке пишуть
надо вызвать __arm_relocate_pie_ но что это за хня и где её искать
умалчивают! Aleksey_75(3 знак., 17.09.2020 19:56, ссылка)
- Офигенно. Не думал, что доживу до 2020 года и увижу
реверс-инженеринг буржуйского софта. Повеяло 90-ми. Как из душа
окатило. - SciFi(17.09.2020 19:51)
- Неправильно! это указатели на переменные используемые в модуле! - Aleksey_75(17.09.2020 19:37)
- Взять GCC и выкинуть что там у тебя, компилятор проф. уровня. Я не
понимаю чем не устраивает GCC. Кроме "там редактор некрасивый". - fk0(15.09.2020 22:23)
- а можно пример как это делается в GCC ?? я с
DYNAMIC_RELOCATION_TABLE фактически разобрался, осталось понять как
определить что переменная в озу. Прога вписывания новых адресов
получается копеечная - Aleksey_75(15.09.2020 22:26)
- Да, с глобальными и статическими переменными засада в гцц. Andreas(141 знак., 15.09.2020 23:26, ссылка)
- где засада, в чем проблема? поподробнее. скрипт линкера не умеем
писать, атрибуты кастомных секций данных не знаем? - klen(15.09.2020 23:32)
- Демонстрация проблемы по ссылке. Дело не в линкере, а ещё в компиляторе. При задании опций -mpic-register=r10 -msingle-pic-base -mno-pic-data-is-text-relative -fpic все обращения к данным идут относительно GOT. Без -mno-pic-data-is-text-relative локальные (static) данные адресуются относительно PC, а глобальные через GOT. С -pie всё адресуется через PC. fk0(690 знак., 16.09.2020 12:50, ссылка, ссылка)
- знаем! только если задать прибитую область даже для рамы, линкер говорит идите нах, либо крестик снять, либо трусы одеть! либо все релок либо все с прибитыми адресами - Aleksey_75(16.09.2020 00:01)
- где засада, в чем проблема? поподробнее. скрипт линкера не умеем
писать, атрибуты кастомных секций данных не знаем? - klen(15.09.2020 23:32)
- Тебе ж LightElf давал ссылку на загрузчик ELF'ов. Кто у кого
скопипастил я не разобрался, сам разбирайся. Там что-то кода много
накручено, можно проще. В конечном счёте нужно записать в нужное
место flash секцию .text, скопировать .data в ОЗУ (и каждый раз при
старте), занулить .bss, потом пробежаться по таблице релокаций и
пофиксить релокации в .data, потом пробежаться по таблице символов
и зарезолвить неизвестные символы (что модуль вызывает из твоей
программы). Заодно fk0(651 знак., 15.09.2020 22:41, ссылка, ссылка)
- по моему elf тащить в прошу потом парсить занятие неблагодарное,
для фалов (ниже) которые весят 408 байт, а elf весит 2кб! - Aleksey_75(15.09.2020 22:49)
- А как, интересно, такие файлы что-то умудряются делать, ну основное
что им нужно, подумалось -- это же C-библиотека. Какой-нибудь там
strlen() вдруг понадобился. Или хуже того, malloc. Получается тебе
её нужно в основной программе, бутлоадере, иметь, и предоставлять
из неё все возможные функции (а не только нужные самой основной
программе). - fk0(16.09.2020 12:05)
- нет никаких strlen и прочих malloc. Модуль умеет делать только то что даст ему основная логика. Обычные автоматы, основная логика получает указатель на функцию в модуле вызывает её с необходимыми параметрами получает результат. Количество возможных функций основной логики вызываемых из модуля крайне ограничено, сейчас их всего 10 и врятли увеличится - Aleksey_75(16.09.2020 13:23)
- хотя! кто мешает на уровне make парсить elf и прилепить к проше
свою структуру чего куда пихать, даже макросы можно влупить.. Хм!
завтра если не
побежупобеждуразломаю , то займусь этим вариком))) - Aleksey_75(16.09.2020 00:06)- Нечто подобное сделано в u-boot. Бинарник U-Boot грузится по фиксированному адресу, но дальше переносит сам себя в самый конец памяти (и релоцируется естественно). Кроме того, линуксовый кернел в формате uImage/zImage тоже является саморелоцирующимся. Возможно там найдутся готовые тулзы и скрипты. - LightElf(16.09.2020 14:07)
- А как, интересно, такие файлы что-то умудряются делать, ну основное
что им нужно, подумалось -- это же C-библиотека. Какой-нибудь там
strlen() вдруг понадобился. Или хуже того, malloc. Получается тебе
её нужно в основной программе, бутлоадере, иметь, и предоставлять
из неё все возможные функции (а не только нужные самой основной
программе). - fk0(16.09.2020 12:05)
- по моему elf тащить в прошу потом парсить занятие неблагодарное,
для фалов (ниже) которые весят 408 байт, а elf весит 2кб! - Aleksey_75(15.09.2020 22:49)
- Да, с глобальными и статическими переменными засада в гцц. Andreas(141 знак., 15.09.2020 23:26, ссылка)
- а можно пример как это делается в GCC ?? я с
DYNAMIC_RELOCATION_TABLE фактически разобрался, осталось понять как
определить что переменная в озу. Прога вписывания новых адресов
получается копеечная - Aleksey_75(15.09.2020 22:26)
- Где бы найти внятное описание DYNAMIC_RELOCATION_TABLE, пока методом научного тыка разобрал следующее, сначала идут сдвиги на адреса используемых в модуле указатели(адреса), в свою очередь которые содержат адреса вызовов (в пределах модуля)! С переменными в Озу пока полный тупик! - Aleksey_75(15.09.2020 22:15)
- Это ищите? Dingo(194 знак., 15.09.2020 17:03, ссылка, ссылка)
- По идее, если он делает самодельную загрузку эльфов, то ему делать
самодельные хидера к бинарнику посредством линкера -- ни к чему. В
ELF всё нужное есть и даже не нужное. - fk0(15.09.2020 22:24)
- не совсем! он делает бинарник но вместо правильных указателей
ставит указатели в пределах собранного файла + таблицы смещения на
указатели которые нужно поправить! Вот файлы , один собран с
фиксированым адресом (и структура прибита ), второй с
неопределенным адресом Aleksey_75(11 знак., 15.09.2020 22:44 - 16.09.2020 00:44, ссылка, картинка)
- Без документации самому копать -- тратить время. Там масса тонких
нюансов. Что делать с данными, что с GOT-таблицей. А что если
расстояние между .text и .data не фиксированное. Если последнее не
решается -- выкинь точно нахер этот проф. компилятор и бери gcc. - fk0(15.09.2020 22:45)
- да 100% должна быть дока или готовая функция которая все это разбирает! но я чтот в упор не нахожу! - Aleksey_75(15.09.2020 22:52)
- Без документации самому копать -- тратить время. Там масса тонких
нюансов. Что делать с данными, что с GOT-таблицей. А что если
расстояние между .text и .data не фиксированное. Если последнее не
решается -- выкинь точно нахер этот проф. компилятор и бери gcc. - fk0(15.09.2020 22:45)
- не совсем! он делает бинарник но вместо правильных указателей
ставит указатели в пределах собранного файла + таблицы смещения на
указатели которые нужно поправить! Вот файлы , один собран с
фиксированым адресом (и структура прибита ), второй с
неопределенным адресом Aleksey_75(11 знак., 15.09.2020 22:44 - 16.09.2020 00:44, ссылка, картинка)
- По идее, если он делает самодельную загрузку эльфов, то ему делать
самодельные хидера к бинарнику посредством линкера -- ни к чему. В
ELF всё нужное есть и даже не нужное. - fk0(15.09.2020 22:24)
- gcc нормально компилит с -fpic. Но я небольшие патчи с ним
компилил. - Andreas(15.09.2020 16:08)
- Расскажи плиз какие дальше махинации при укладке в новый адрес - Aleksey_75(15.09.2020 16:12)
- Никаких. Получаю бинарник, который шью в любой адрес. Потом просто
на него перехожу. Andreas(344 знак., 15.09.2020 16:26)
- при --fpic выдает "Fatal error: L3921U: Option '--fpic' not
available with your license." при --bare_metal_pie создает два
бинарника и непонятно что с ними делать - Aleksey_75(15.09.2020 16:29)
- Подробности в документе по ссылке. Как я понял, bare metal --
изобретение самодельного ELF'а и закат солнца вручную. Проще взять
GCC. - fk0(15.09.2020 22:32, ссылка)
- а у Вас файл качается ? у меня нет, но я его нашел , там речь о
создании, а не развороте! по созданию у меня уже вопросов нету - Aleksey_75(15.09.2020 22:35)
- ARM'у сайт делают гении UI-дизайна. Я тоже несколько лет жаловался
на то, что файлы не качаются. Пока не узнал куда нажимать: fk0(1 знак., 15.09.2020 22:47, картинка)
- аааа! спасибо! буду знать !))) - Aleksey_75(15.09.2020 22:50)
- ARM'у сайт делают гении UI-дизайна. Я тоже несколько лет жаловался
на то, что файлы не качаются. Пока не узнал куда нажимать: fk0(1 знак., 15.09.2020 22:47, картинка)
- а у Вас файл качается ? у меня нет, но я его нашел , там речь о
создании, а не развороте! по созданию у меня уже вопросов нету - Aleksey_75(15.09.2020 22:35)
- Это я видел, но armlink ничего не могу сказать, не пользуюсь. - Andreas(15.09.2020 16:43)
- Подробности в документе по ссылке. Как я понял, bare metal --
изобретение самодельного ELF'а и закат солнца вручную. Проще взять
GCC. - fk0(15.09.2020 22:32, ссылка)
- при --fpic выдает "Fatal error: L3921U: Option '--fpic' not
available with your license." при --bare_metal_pie создает два
бинарника и непонятно что с ними делать - Aleksey_75(15.09.2020 16:29)
- Никаких. Получаю бинарник, который шью в любой адрес. Потом просто
на него перехожу. Andreas(344 знак., 15.09.2020 16:26)
- Расскажи плиз какие дальше махинации при укладке в новый адрес - Aleksey_75(15.09.2020 16:12)
- И что, мануал молчит как рыба об лёд? - SciFi(15.09.2020 16:03)
- вообще упоминаний нет и гугель не дает примеров использования - Aleksey_75(15.09.2020 16:06)
- А если ROPI? - SciFi(15.09.2020 16:09)
- ну в данном примере вообще нет RO данных, но попробую - Aleksey_75(15.09.2020 16:15)
- Что попробую? Почитать мануал? Пожалуй, это хорошая идея :-) - SciFi(15.09.2020 16:21)
- ))) В доках вообще ничего нет как употреблять! с --ROPI говорит идите нах нет таких секций тута - Aleksey_75(15.09.2020 16:26)
- Что попробую? Почитать мануал? Пожалуй, это хорошая идея :-) - SciFi(15.09.2020 16:21)
- ну в данном примере вообще нет RO данных, но попробую - Aleksey_75(15.09.2020 16:15)
- А если ROPI? - SciFi(15.09.2020 16:09)
- вообще упоминаний нет и гугель не дает примеров использования - Aleksey_75(15.09.2020 16:06)
- ПОБЕДА! Подробности Aleksey_75(682 знак., 18.09.2020 22:49)