Eu finalmente percebi isso. O kernel mapeia apenas dois segmentos. A terceira parte é uma parte de uma das duas carregadas pelo kernel. O linker de tempo de execução, o programa chamado no php do INTERP, que é /usr/lib/ld-2.24.so para mim agora, altera as permissões nos mapeamentos usando mprotect()
para que haja variáveis globais de leitura / gravação, variáveis globais somente leitura e um segmento de texto de leitura / execução. Você pode ver isso acontecer usando strace
, mas é fácil perder, já que é apenas uma única chamada mprotect()
.
Não foi uma mudança no kernel que causou isso, foi uma mudança no GNU lib C.