Как вставить команду LC_LOAD_DYLIB в двоичный файл Mach-O (OSX)
Вопрос
Я собираюсь исправить часть оставленной программы с помощью некоторого кода.
Программное обеспечение основано на углероде, поэтому я не могу использовать InputManager (по крайней мере, я не думаю, что смогу). Моя идея состояла в том, чтобы добавить ссылку на dylib в заголовок mach-o и запустить новый поток при вызове процедуры инициализации.
Я перебрал заголовок mach-o, используя шестигранник, чтобы добавить соответствующую команду загрузки (LC_ LOAD_DYLIB). Р>
otool сообщает, что я ожидаю увидеть, поэтому я вполне уверен, что файл правильно отформатирован.
Load command 63 cmd LC_LOAD_DYLIB cmdsize 60 name @executable_path/libAltInput.dylib (offset 24) time stamp 1183743291 Fri Jul 6 19:34:51 2007 current version 0.0.0 compatibility version 0.0.0
Однако при запуске бинарного файла возникает следующая ошибка
dyld: bad external relocation length
Я могу предположить, что это означает, что мне нужно изменить разделы LC_ SYMTAB или LC_ DYNSYMTAB ...
У кого-нибудь есть идеи?
Решение
Я не совсем уверен, что вы пытаетесь выполнить, но самый простой способ сделать это, вероятно, - вставить поток в задачу mach после ее запуска. Отличный источник информации об этом (а также о запуске кода для этого) можно найти здесь: http: // rentzsch .com / mach_inject / .
Некоторые предупреждения, о которых вам следует знать:
<Ол>Другие советы
Самое простое решение, которое не включает исправление двоичного файла, - это просто использовать переменную среды DYLD_INSERT_LIBRARIES и затем запустить приложение.
set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib
Я предполагаю, что причина, по которой динамический компоновщик сообщил об ошибке, заключается в том, что многие поля в формате файла Mach-O содержат адреса, указанные как смещение от начала файла, поэтому добавление еще одной команды загрузки приведет к аннулированию каждого адреса. Например, смотрите записи symoff
и stroff
в Справочник по формату файлов Mac-O ABI Mac OS X .