| Расширение сегмента кода |
[Oct. 9th, 2008|02:36 pm] |
Принцип «Работает — не трогай!» называют иногда «золотым правилом». Только вот беда, это «золотое» правило возвращает нас в бронзовый век. Если метод прост, надёжен и используется десяток лет, то никто и не пытается его улучшить. Пока не придёт кто-нибудь с непрокомпостированными мозгами, например Якуб Желинек. В начале сам допёр, разглядывая бинари, а потом сообразил, что именно так и работает prelink.
( Как? ) |
|
|
| .dynamic |
[Oct. 9th, 2008|07:27 pm] |
К 32-м нулям в .dynamic зарезервированым для prelink можно ещё добавить DT_INIT/DT_FINI (в экзешках линкер игнорирует эти таги, а в библиотеках их можно использовать, как точку входа). А можно не убивать, а заменить на DT_FLAGS со значением DF_BIND_NOW, после чего можно грохнуть команды (push .../jmp _plt) в .plt и получить 16 + <number of .plt entries>*10 байт. Можно связать освобождённое таким образом место при помощи «EB 06». И следить за тем, чтобы в собственном коде не было инструкций длинее 8 байт.
( Где-то так... ) |
|
|