-
- Как и обещал, сделаю развернутое пояснение. Для начала стоит
обратить внимание на выхлоп компилятора, для чего скормим файл
прошивки программе readelf (в качестве примера я взял пример blink
из своей либины): evgeniy1294(3147 знак., 21.10.2020 21:56)
- 1. Проверка if (dl != ds) не нужна. На этапе компиляции значения dl
и ds неизвестны, их линкер подставляет. Поэтому оптимизация тут не
сработает. А дальше while и без этой проверки всё правильно
сделает. VladislavS.(1485 знак., 22.10.2020 08:32)
- 1. "Проверка if (dl != ds) не нужна" - да, действительно не нужна,
выпилю. evgeniy1294(931 знак., 22.10.2020 10:18)
- "Просто выпиливанием __libc_init_array() тут не обойтись." - ключ
-nostartfiles всё делает. Остаётся только руками конструкторы
вызвать. VladislavS.(83 знак., 22.10.2020 12:04)
- Немного оптимизировал функцию вызова конструкторов. Ещё 16 байт
сэкономлено. VladislavS.(293 знак., 22.10.2020 15:53)
- Это уже просто неприлично. Желаете ловить
блохбиты и байты — стряхните пыль с ассемблера. - SciFi(22.10.2020 15:55)- Не уверен, что на ассемблере будет лучше. - VladislavS.(22.10.2020 16:24)
- Это уже просто неприлично. Желаете ловить
- Немного оптимизировал функцию вызова конструкторов. Ещё 16 байт
сэкономлено. VladislavS.(293 знак., 22.10.2020 15:53)
- "Просто выпиливанием __libc_init_array() тут не обойтись." - ключ
-nostartfiles всё делает. Остаётся только руками конструкторы
вызвать. VladislavS.(83 знак., 22.10.2020 12:04)
- 1. "Проверка if (dl != ds) не нужна" - да, действительно не нужна,
выпилю. evgeniy1294(931 знак., 22.10.2020 10:18)
- Спасибо за развернутый ответ! А вы уверены что ZI-дата обнуляется
именно так а не копируется напрямую с флеши ? мелкие массивы
копируются напрямую точно знаю! - Aleksey_75(21.10.2020 22:12)
- У тебя же не gcc? Мешаете тёплое и мягкое. - SciFi(21.10.2020 22:28)
- не gcc... вопрос! а с gcc можно собирать без установки пакета? ну
т.е. бросил два екзешника компилер и линкер в репозиторий и на
любом компе собрал ? - Aleksey_75(22.10.2020 00:22)
- Почему-то многие думают, что gcc — это просто экзешник, который к тому же умеет все архитектуры (опен соус жеж!). GCC — это проект с большим деревом исходников, который рождает множество разных компиляторов. А на самом деле тебе интересен тулчейн (его тоже часто называют gcc), и туда кроме компилятора входит, например, такая немаловажная часть, как стандартная сишная библиотека, и это уже не gcc, а другой проект, но кому это интересно... - SciFi(22.10.2020 09:20)
- Ну не два экзешника, но просто распаковать toolchain в отдельную
папку, прописать к нему пути и собирай make. - VladislavS.(22.10.2020 08:00)
- +1. Уже много лет так делаю. - SciFi(22.10.2020 08:57)
- не gcc... вопрос! а с gcc можно собирать без установки пакета? ну
т.е. бросил два екзешника компилер и линкер в репозиторий и на
любом компе собрал ? - Aleksey_75(22.10.2020 00:22)
- У тебя же не gcc? Мешаете тёплое и мягкое. - SciFi(21.10.2020 22:28)
- 1. Проверка if (dl != ds) не нужна. На этапе компиляции значения dl
и ds неизвестны, их линкер подставляет. Поэтому оптимизация тут не
сработает. А дальше while и без этой проверки всё правильно
сделает. VladislavS.(1485 знак., 22.10.2020 08:32)
- Нужно завести секцию .bss_RAM<что-то> по нужному адресу и соответственно размещать в секции. Тогда будет нормальная инициализация. - Kabdim(21.10.2020 12:26)
- Потому что обнуляемые значения покоятся в секции bss, а у вас
массив черт знает где (ADR). Секция bss обнуляется в стартапе, вам
придётся либо разместить массив в ней, либо обнулять вручную. evgeniy1294(144 знак., 21.10.2020 01:11)
- т.е. это норм ? мне в принципе обнуление не нужно, т.к. дальнейший
инит заполняет эту область нужным. Просто интересно стало. adr ==
0x20000040. В начале рамы - Aleksey_75(21.10.2020 01:15 - 01:31)
- Дело не в "начале" или "конце". Утром приведу корректный код. - evgeniy1294(21.10.2020 01:19)
- А bss где? Вообще, я бы не обнулял такие массивы, а явно запихнул их в noinit. - evgeniy1294(21.10.2020 01:18)
- т.е. это норм ? мне в принципе обнуление не нужно, т.к. дальнейший
инит заполняет эту область нужным. Просто интересно стало. adr ==
0x20000040. В начале рамы - Aleksey_75(21.10.2020 01:15 - 01:31)
- Как и обещал, сделаю развернутое пояснение. Для начала стоит
обратить внимание на выхлоп компилятора, для чего скормим файл
прошивки программе readelf (в качестве примера я взял пример blink
из своей либины): evgeniy1294(3147 знак., 21.10.2020 21:56)