2010-10-05 9 views
7

Rozumiem znaczenie bitów rwxps. r-xp jest dla .text. rw-p jest dla .data/.bss/heap/stack. Jaki jest pożytek z zaledwie stron ---p?Co oznaczają uprawnienia "--- p" w/proc/self/map?

Na przykład zobaczyć ten wyjście cat /proc/self/maps

 
00400000-0040b000 r-xp 00000000 08:03 827490        /bin/cat 
0060b000-0060c000 rw-p 0000b000 08:03 827490        /bin/cat 
0060c000-0062d000 rw-p 00000000 00:00 0         [heap] 
3819a00000-3819a1e000 r-xp 00000000 08:03 532487       /lib64 ld-2.11.2.so 
3819c1d000-3819c1e000 r--p 0001d000 08:03 532487       /lib64/ld-2.11.2.so 
3819c1e000-3819c1f000 rw-p 0001e000 08:03 532487       /lib64/ld-2.11.2.so 
3819c1f000-3819c20000 rw-p 00000000 00:00 0 
3819e00000-3819f70000 r-xp 00000000 08:03 532490       /lib64/libc-2.11.2.so 
3819f70000-381a16f000 ---p 00170000 08:03 532490       /lib64/libc-2.11.2.so 
381a16f000-381a173000 r--p 0016f000 08:03 532490       /lib64/libc-2.11.2.so 
381a173000-381a174000 rw-p 00173000 08:03 532490       /lib64/libc-2.11.2.so 
381a174000-381a179000 rw-p 00000000 00:00 0 
7fb859c49000-7fb85fa7a000 r--p 00000000 08:03 192261      /usr/lib/locale/locale-archive 
7fb85fa7a000-7fb85fa7d000 rw-p 00000000 00:00 0 
7fb85fa95000-7fb85fa96000 rw-p 00000000 00:00 0 
7fff64894000-7fff648a9000 rw-p 00000000 00:00 0       [stack] 
7fff649ff000-7fff64a00000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
+1

Zobacz odpowiedź tutaj: http://stackoverflow.com/questions/16524895/proc-pid-maps-shows-pages-with-no-rwx-permissions-on-x86-64-linux – Enyby

Odpowiedz

1

Według man page, oznacza to prywatne (kopiowane przy zapisie). Nie wiadomo, jaka jest użyteczność takiego mapowania, ale nie można go odczytać/zapisać/wykonać.

Możliwe, że jest prywatne dla biblioteki libc, co pozwala modyfikować uprawnienia dostępu do niej bez przypadkowego zmarnowania programu użytkownika.

+0

Myślę, że to jest tak ponieważ jeśli program, w którym można zmodyfikować używaną kopię libc, zmodyfikowana biblioteka libc byłaby odwzorowywana w przestrzeni pamięci tego procesu, tak aby nadal była niezmodyfikowana dla innych procesów. – Dio

0

To jest coś, co również zastanawiałem się nad jego specyfikacjami. Pojawiło się dopiero w ciągu kilku ostatnich lat, ale nie jestem pewien, czy za zmiany odpowiadają GNU binutils lub dynamiczny linker glibc (ld-linux.so.2).

Początkowo myślałem, że jest to rodzaj obszaru ochronnego utworzonego przez dynamiczny linker, aby zabezpieczyć się przed dostępem poza granice do segmentu danych biblioteki, ale nie ma sensu, aby był tak duży. Możliwe, że jest to kompletna mapa pliku biblioteki while, aby dynamiczny linker mógł ponownie ją odczytać w przyszłości (być może podczas połączeń dlopen lub dlsym), aby uzyskać dostęp do metadanych ELF, które normalnie nie muszą być mapowane.

W każdym razie jest to paskudne wzdęcie, szczególnie na komputerach 32-bitowych, gdzie wirtualna przestrzeń adresowa jest cennym zasobem. Powoduje również nadmiar tabel stron jądra, zwiększając zasoby jądra używane przez proces.

P.S. Przepraszam, że to nie jest odpowiedź. Wiem, że to tylko przypadkowe fragmenty, które mogą pomóc w uzyskaniu odpowiedzi, ale było to zbyt długie na komentarz.