Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

327
Visualizações
¿Por qué las direcciones de las instrucciones en la parte superior del espacio de usuario de la memoria son contrarias al diseño de la memoria del proceso de Linux?
#include <stdio.h> void func() {} int main() { printf("%p", &func); return 0; }

Este programa 0x55c4cda9464a Suponiendo que func se almacenará en la sección .text , y de acuerdo con esta figura, desde CS:APP : ingrese la descripción de la imagen aquí Supongo que la dirección de func estaría cerca de la dirección inicial de la sección .text , pero esta dirección está en algún punto intermedio. ¿Por qué es este el caso? Las variables locales almacenadas en la pila tienen direcciones cercanas a 2^48 - 1, pero traté de desensamblar diferentes códigos C y las instrucciones siempre estaban ubicadas en algún lugar alrededor de esa dirección 0x55...

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

gcc , cuando se configura con --enable-default-pie 1 (que es el predeterminado), produce Ejecutables independientes de posición (PIE) . Lo que significa que la dirección de carga no es la misma que la especificada por el enlazador en tiempo de compilación (0x400000 para x86_64). Este es un mecanismo de seguridad para que se pueda habilitar la aleatorización del diseño del espacio de direcciones (ASLR) 2 . Es decir, gcc compila con la opción -pie por defecto.

Si compila con la opción -no-pie ( gcc -no-pie file.c ), puede ver que la dirección de func está más cerca de 0x400000.

En mi sistema, obtengo:

 $ gcc -no-pie tc $ ./a.out 0x401132

También puede verificar la dirección de carga con readelf :

 $ readelf -Wl a.out | grep LOAD LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x000478 0x000478 R 0x1000 LOAD 0x001000 0x0000000000401000 0x0000000000401000 0x0001f5 0x0001f5 RE 0x1000 LOAD 0x002000 0x0000000000402000 0x0000000000402000 0x000158 0x000158 R 0x1000 LOAD 0x002e10 0x0000000000403e10 0x0000000000403e10 0x000228 0x000230 RW 0x1000

1 puede verificar esto con gcc --verbose .

2 También puede notar que la dirección impresa por su programa es diferente en cada ejecución. Eso es debido a ASLR. Puedes desactivarlo con:

 $ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

ASLR está habilitado en Linux de forma predeterminada.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda