ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
24 апреля
904933 Топик полностью
fk0, легенда (17.02.2019 23:29, просмотров: 213) ответил fk0 на Если адрес заранее не известен, то всё таки напрашивается PIC (positional independent code). Не всякий компилятор умеет. Большие и для больших процессоров -- умеют (gcc для ARM, MIPS), ибо нужно для динамических библиотек в ОС. Мелкие
Вдогонку, да ещё call convention (ABI) в случае PIC и не-PIC кода может отличаться для конкретной архитектуры. С чем на MIPS пришлось столкнуться: для PIC-кода принято при вызовах всех функций в регистр t9 помещать их адрес -- так вызванная функция может из своего адреса вычислить адрес GOT-таблицы путём прибавки захардкоженного смещения. В не-PIC коде такого соглашения нет. В итоге PIC-код может вызывать не-PIC код, а в обратную сторону не получится, из не-PIC кода вызвать PIC-код нельзя (можно, но только функции в которых пролог на ассемблере будет исправлен чтоб свой адрес вычислять). В итоге пришлось для интерфейса между не-PIC и PIC-кодом писать врапперы на каждую функцию, которые восстанавливали t9. Верней в обратную сторону пришлось -- PIC-код выдавался в коллбэках и пришлось писать врапперы на все функции задающие коллбэки, чтоб они подменяли адрес функции на свой враппер, который восстанавливает t9 и вызывает настоящий коллбэк. Можно, но муторно в общем, нужно иметь ввиду.
[ZX]