У меня есть три вопроса для вас, всех связанных с dyld :)dyld API на iPhone - странный выход
Я использую this dyld man page в качестве основы. Я скомпилировал следующий код и успешно выполнил двоичный код на моем джейлбрейк-устройстве.
#include <stdio.h>
#include <mach-o/dyld.h>
int main(int argc, const char* argv[]) {
uint32_t image_count, i;
image_count = _dyld_image_count();
for (i = 0; i < image_count; i++) {
printf("%s\n", _dyld_get_image_name(i));
}
return 0;
}
Я думал, что эти функции позволяют мне находить все разделяемые библиотеки, которые загружаются в адресное пространство моей программы. На моем mac, выход довольно прост: он показывает пути ко всем библиотекам, которые в настоящее время загружаются в память. На моем iPhone вывод почти такой же - я также получаю файловые пути - но файлов в указанном месте нет. (На мой макинтош с другой стороны, я могу найти файлы!)
Это пример строки с выхода: /usr/lib/system/libdyld.dylib
Согласно Ls, IFILE и все другие инструменты, которые я использовал, этот каталог (/ usr/lib/system /) пуст. Зачем? Где эти файлы?
Еще одна вещь, которую я хотел бы знать: возможно ли найти библиотеку в памяти? От какого смещения до какого смещения библиотека отображается в память? Я думаю, что знаю, как найти начало, но я понятия не имею, как найти конец библиотеки. Чтобы найти начало, я бы использовал адрес, возвращенный _dyld_get_image_header - это правильно?
Последний вопрос: Я хотел загрузить динамическую библиотеку в общесистемную систему, поэтому я предположил, что могу использовать DYLD_INSERT_LIBRARIES, чтобы сделать именно это. Тем не менее, каждый двоичный файл, который я пытаюсь выполнить после вставки моих сбоев в lib, вызывает ошибку шины! Я что-то забыл или это динамическая библиотека, которая вызывает крах?
Вы должны добавить, что работаете на джейлбрейк-устройстве. Если вы не работаете на джейлбрейк-устройстве, то это аргумент в пользу неожиданного поведения, поскольку приложения изолированы песком и не имеют доступа к ним за пределами их маленькой песочницы. – Till
Не размер библиотеки, хранящийся в заголовке? Else: указанных файлов нет, потому что на самом деле там нет! Они хранятся в кеше ядра, но у них есть путь к жесткому кодированию в файл dylib, поэтому dyld сообщает им, где они (на самом деле). –