Когда библиотека динамически связана с программой, имеет ли она тот же адрес в этой программе, что и в любой другой программе?
В моей голове я представил, что каждый процесс получает все адресное пространство, а затем все в этом процессе (включая динамические библиотеки, которые уже находятся в памяти) сопоставляются с полуслучайными его частями из-за ASLR.
Но я провел небольшой эксперимент, который, кажется, подразумевает, что адреса библиотек, которые находятся в памяти, фиксированы для разных процессов и, следовательно, могут быть повторно использованы в программах? Это верно?
Я написал две короткие программы на c, в которых использовалась функция "сна". В одном я распечатал адрес функции сна, а во втором назначил указатель функции этому адресу. Я запустил их оба, и функция сна работала в обоих.
#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
printf("%s\n", &"hi");
sleep(2);
printf("pointer to sleep: %p\n", sleep);
}
}
#include <stdio.h>
#include <unistd.h>
#define sleepagain ((void (*)(int))0x7fff7652e669) //addr of sleep from first program
int main()
{
while(1)
{
printf("%s\n", &"test");
sleepagain(2);
}
}
Я не был уверен, что это покажет, но на самом деле это показало: а) адрес был тем же самым каждый раз, когда я запускал первую программу, и б) что сон все еще работал, когда я запускал вторую.
Думаю, я понимаю, как это работает, но мне любопытно, должно ли работать так, как работает, и каковы причины этого?
Чтобы сослаться на ответ, который я уже получил, когда взглянул на otool -IvV
, я получил:
a.out:
Indirect symbols for (__TEXT,__stubs) 2 entries
address index name
0x0000000100000f62 2 _printf
0x0000000100000f68 3 _sleep
Indirect symbols for (__DATA,__nl_symbol_ptr) 2 entries
address index name
0x0000000100001000 4 dyld_stub_binder
0x0000000100001008 ABSOLUTE
Indirect symbols for (__DATA,__got) 1 entries
address index name
0x0000000100001010 3 _sleep
Indirect symbols for (__DATA,__la_symbol_ptr) 2 entries
address index name
0x0000000100001018 2 _printf
0x0000000100001020 3 _sleep
То же самое, что и косвенный адрес в lldb. Адрес был адресом самого сна:
Process 11209 launched: 'stuff/a.out' (x86_64)
hi
Process 11209 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x00007fff7652e669 libsystem_c.dylib`sleep
libsystem_c.dylib`sleep:
-> 0x7fff7652e669 <+0>: push rbp
0x7fff7652e66a <+1>: mov rbp, rsp
0x7fff7652e66d <+4>: push rbx
0x7fff7652e66e <+5>: sub rsp, 0x28
Target 0: (a.out) stopped.
Для дополнительной информации:
$ otool -hv a.out
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL LIB64 EXECUTE 15 1296 NOUNDEFS DYLDLINK TWOLEVEL PIE