Этот код у меня на x86_64 по дефолту выдаёт 0.
#include <stdio.h>
#include <sys/personality.h>
int main(void)
{
printf("READ_IMPLIES_EXEC: %d\n", (personality(0xffffffff) & READ_IMPLIES_EXEC) != 0);
return 0;
}
Есть один проект, в котором ВНЕЗАПНО в /proc/[pid]/maps засверкало много x в permissions.
Копали-копали, оказалось:
$ LD_LIBRARY_PATH=/somedir ./projectexecutable
READ_IMPLIES_EXEC: 1
$ LD_LIBRARY_PATH=/somedir /lib64/ld-linux-x86-64.so.2 ./projectexecutable
READ_IMPLIES_EXEC: 0
Проверка на READ_IMPLIES_EXEC идёт в первой строке в main. В strace вызовов personality, кроме как с 0xffffffff, нет.
И ещё более внезапно:
$ readelf -l ./prog
...
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 0x1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
...
Куда копать?