- Какой адрес
0x00007fff6f8c5550
? Я предполагаю, что это указатель на функцию printf.
Да, это правильно.
Это виртуальный адрес, который существует только в отображенном пространстве текущий процесс?
Ну да и нет. Это виртуальный адрес, указывающий c для вашего процесса, и вы не должны предполагать, что он действителен в другом процессе. Но:
Если да, почему другая программа возвращает тот же адрес для printf
?
В качестве оптимизации macOS использует общее отображение для большей части системные библиотеки. Они загружаются один раз при загрузке и используются всеми процессами. Для данной загрузки адрес постоянен во всех таких процессах. Тем не менее, адрес рандомизируется при каждой загрузке в целях безопасности.
Предполагая, что это какой-то глобальный общий адрес, который одинаков для каждого процесса, при изменении содержимого данных по этому адресу (что я пока не смог сделать) создаст копию измененной страницы памяти и будет изменение адреса?
Ну, это сопоставлено копирование при записи. Таким образом, изменение его создаст копию. Однако это не изменит его адрес. ОС просто изменила бы отображение так, чтобы память вокруг этого адреса была приватной для вашего процесса.
(я работаю в ОС Ma c, и я предполагаю, что один процесс не может изменить общую память на другой process)
Процессы могут взаимодействовать, чтобы иметь доступную для записи общую память. Но в целом вы правы в том, что меры безопасности предотвращают нежелательные изменения в памяти процесса.
Почему expr &scanf
не работает, а expr &printf
работает?
Ваша программа (предположительно) не использует scanf
, поэтому отладочной информации об этом нет. Главное, что отсутствует lldb
- это тип scanf
. Если вы используете выражение приведения, оно может работать:
(lldb) p scanf
error: 'scanf' has unknown type; cast it to its declared type to use it
(lldb) p &scanf
error: unsupported expression with unknown type
(lldb) p (int(*)(const char * __restrict, ...))scanf
(int (*)(const char *__restrict, ...)) $3 = 0x00007fffd7e958d4 (libsystem_c.dylib`scanf)
И наоборот, оно работает для printf
, потому что ваша программа его использует.