由于地址空间布局随机化(ALSR),我预计从另一个进程派生的进程在调用时返回的地址将不同。但是,我发现并非如此。我为此编写了以下测试程序。父进程和子进程返回的所有地址都完全相同。
请注意,cl1,cl2,pl1,pl2的内部使用,因为它们是大块。
那么,我的问题是,即使存在ALSR,为什么也没有返回不同的地址。也许这是因为随机化的种子在原始进程和派生进程中是相同的。还是有其他原因呢?
int main()
{
pid = fork();
if (pid == 0) // child
{
void * c1 = malloc( 4096 );
void * c2 = malloc( 4096 );
void * cl1 = malloc( (long)512e3 ); // internally uses mmap
void * cl2 = malloc( (long)512e3 ); // internally uses mmap
printf( "c1 = %p, c2 = %p, cl1 = %p, cl2 = %p!\n", c1, c2, cl1, cl2 );
}
else
{
void * p1 = malloc( 4096 );
void * p2 = malloc( 4096 );
void * pl1 = malloc( (long)512e3 ); // internally uses mmap
void * pl2 = malloc( (long)512e3 ); // internally uses mmap
printf( "p1 = %p, p2 = %p, pl1 = %p, pl2 = %p!\n", p1, p2, pl1, pl2 );
}
return 0;
}
mmap
返回不同的地址,它只是意味着它可能返回不同的地址。或许(只是猜测!)它更可能是由execve
触发而不是fork
。如果我连续两次启动你的程序,我会得到不同的地址。这可能会随着未来的内核版本或启用 SELinux 而发生变化... - Basile Starynkevitch