ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
24 апреля
1037765 Топик полностью
fk0, легенда (19.09.2020 00:11, просмотров: 420) ответил Aleksey_75 на не очень понимаю "А если положили на не кратную " я все го лишь меняю адреса .... За эти дни я физически перелопатил все возможные вариант и сделал вывод что все сводится к подмене адресов! в общем посмотрим! в логгер добавил события, будем посмотреть !
ELF в конечном счёте состоит из секций, в которых лежат переменные-объекты или функции кода. И объектный файл тоже из таких секций. А дальше начинаются приключения. Объекты сложенные в секцию .data могут иметь условие выравнивания на какую-то границу. Сами секции тоже. Функции должны быть выравнены на границу из 16 байт (так может требовать ABI -- иначе что-нибудь поломается в коде, сам процессор-то исполнять конечно не перестанет). И пока оно всё внутри объектных файлов -- 

там адреса ещё не назначены и что угодно как угодно подвигать можно (в т.ч. одинаковые секции из разных объектных файлов склеить вместе). Для того, чтоб двигалось существуют релокации. Которые описывают что и как поменять после передвижек. И есть атрибуты, которые говорят как выравнивать в памяти. При склеивании объектников в ELF оно всё двигается как надо, в нужном порядке выстраивается и прибивается гвоздями (бывает релоцируемый ELF -- но это отдельная история, сложная). Если ELF -- динамическая библиотека, то во-первых код генерируется по другому, чтоб ограничить множество релокаций, во-вторых прибивается гвоздями не совсем всё и подмножесто более простых релокаций остаётся, позволяющих в основном двигать ELF по памяти вверх вниз. При этом расстояние между .text и .data таки уже прибито гвоздями. И выравнивание -- кратно 4096 байтам (в итоге все более мелкие выравнивания автомагически удовлетворяются).


По-моему у тебя уже должна была забрежжить мысль, что скомпилировав с разным базовым адресом можно запросто (из-за выравнивания) получить файлы разных размеров. Потом переменные же могут не только адресами инициализироваться. Или в коде не только же адреса могут быть. А например загрузка непосредственного значения константы. По частям (младшая половина в одной команде, старшая в другой). И при этом константа не адрес, а арифметическое выражение посчитанное над адресом. Где там сложения, вычитания, деления, умножения, сдвиги... Много ты там на сравниваешь? К счастью C ограничивает полёт фантазии, ассемблеры прошлого тысячелетия были более изощрёны в этом.

[ZX]