Que dados são armazenados no segundo segmento de memória específico do programa somente leitura?

0

Estou aprendendo sobre gerenciamento de memória e estou tentando identificar o que o segundo segmento de memória somente leitura, específico do meu programa, está armazenando.

00400000-00401000 r-xp 00000000 00:28 144 /a.out
00600000-00601000 r--p 00000000 00:28 144 /a.out
00601000-00602000 rw-p 00001000 00:28 144 /a.out

Eu, penso eu, identifiquei o segmento de intervalo inferior como sendo o segmento de código (ou segmento de texto) onde o código de execução e as variáveis globais constantes são armazenados. Eu também acredito que o terceiro segmento, com acesso de leitura / gravação, é o segmento de dados onde armazenamos variáveis globais e estáticas.

Minha pesquisa me diz que existe um segmento chamado BSS onde as variáveis não inicializadas são armazenadas. Mas o segundo segmento de memória entre o endereço 00600000-00601000 é mostrado como somente leitura, com certeza haveria variáveis não inicializadas lá (como uma delas seria inicializada?).

Minha teoria é que armazenamos variáveis globais constantes aqui, mas a pesquisa e a experimentação mostraram que esse não é o caso, já que ele é armazenado em segmentos de texto.

Eu também li sobre um segmento de dados somente leitura (rodata) que, pelo que entendi, deve conter dados constantes estáticos, é isso? e por que meus globals constantes são armazenados aqui?

Estou usando o gcc para compilar meu programa de teste.

    
por Christian Eriksson 29.01.2017 / 21:02

1 resposta

0

r--p indica um segmento que é somente leitura e não é executável. Com um executável ELF típico, isso contém algumas informações do vinculador. Você pode executar objdump -D a.out ou readelf -a a.out para ter uma ideia do que está nesse segmento. Por exemplo, readelf -a /bin/sleep on x86_64 no Debian Linux mostra as seguintes seções nesse segmento:

  [18] .init_array       INIT_ARRAY       0000000000606e10  00006e10
       0000000000000008  0000000000000000  WA       0     0     8
  [19] .fini_array       FINI_ARRAY       0000000000606e18  00006e18
       0000000000000008  0000000000000000  WA       0     0     8
  [20] .jcr              PROGBITS         0000000000606e20  00006e20
       0000000000000008  0000000000000000  WA       0     0     8
  [21] .dynamic          DYNAMIC          0000000000606e28  00006e28
       00000000000001d0  0000000000000010  WA       6     0     8
  [22] .got              PROGBITS         0000000000606ff8  00006ff8
       0000000000000008  0000000000000008  WA       0     0     8

A LSB documenta estas seções.

    
por 30.01.2017 / 01:30