servicio raspberry programas programa inicio iniciar generado examples encender ejecutar ejecución creator automatico automaticamente arranque aplicaciones abortado linux gcc raspberry-pi arm compiler-options

linux - programas - ¿Por qué el segmento de pila es ejecutable en Raspberry Pi?



qt creator raspberry pi examples (1)

Es probable que /usr/lib/arm-linux-gnueabihf/libarmmem.so esté causando esto. Encontré este archivo fuente:

Carece de la anotación de pila no ejecutable, por lo que glibc conservativamente hace que la pila sea ejecutable cuando el DSO está precargado. Los otros archivos fuente tienen esto:

/* Prevent the stack from becoming executable */ #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits #endif

Entonces solo necesita copiar esto en architecture.S (al final del archivo) y reconstruirlo.

Puede verificar con eu-readelf -l /usr/lib/arm-linux-gnueabihf/libarmmem.so si este DSO es el culpable. Debería mostrar ningún GNU_STACK programa GNU_STACK o un GNU_STACK programa GNU_STACK marcado como RWE en la penúltima columna.

Tengo una Raspberry Pi 3 con el sistema operativo Raspbian GNU / Linux 8 (Jessie).

Escribí este sencillo programa. Lo compilé con gcc -o hello hello.c .

#include <stdio.h> void main(){ printf("hello!/n"); }

A partir de la salida real, todo parece estar bien:

Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align EXIDX 0x0004cc 0x000104cc 0x000104cc 0x00008 0x00008 R 0x4 PHDR 0x000034 0x00010034 0x00010034 0x00120 0x00120 R E 0x4 INTERP 0x000154 0x00010154 0x00010154 0x00019 0x00019 R 0x1 [Requesting program interpreter: /lib/ld-linux-armhf.so.3] LOAD 0x000000 0x00010000 0x00010000 0x004d8 0x004d8 R E 0x10000 LOAD 0x000f0c 0x00020f0c 0x00020f0c 0x0011c 0x00120 RW 0x10000 DYNAMIC 0x000f18 0x00020f18 0x00020f18 0x000e8 0x000e8 RW 0x4 NOTE 0x000170 0x00010170 0x00010170 0x00044 0x00044 R 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10 GNU_RELRO 0x000f0c 0x00020f0c 0x00020f0c 0x000f4 0x000f4 R 0x1

Pero cuando ejecuto el programa, la pila es ejecutable:

0x7efdf000 0x7f000000 0x00000000 rwx [stack]

Intento compilar también con la opción -z noexecstack , pero nada cambia.

Intento también descargar la versión de libarmmem.so que tiene este código:

#if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits #endif

Pero nada cambia.

¿Por qué el segmento de pila es ejecutable en Raspberry Pi?

Editar Agrego el resultado del comando LD_DEBUG = files ./hello

23110: 23110: file=/usr/lib/arm-linux-gnueabihf/libarmmem.so [0]; needed by ./hello [0] 23110: file=/usr/lib/arm-linux-gnueabihf/libarmmem.so [0]; generating link map 23110: dynamic: 0x76f273fc base: 0x76f13000 size: 0x00014524 23110: entry: 0x76f13568 phdr: 0x76f13034 phnum: 6 23110: 23110: 23110: file=libc.so.6 [0]; needed by ./hello [0] 23110: file=libc.so.6 [0]; generating link map 23110: dynamic: 0x76f0ef20 base: 0x76dd4000 size: 0x0013e550 23110: entry: 0x76dea840 phdr: 0x76dd4034 phnum: 10 23110: 23110: 23110: calling init: /lib/arm-linux-gnueabihf/libc.so.6 23110: 23110: 23110: calling init: /usr/lib/arm-linux-gnueabihf/libarmmem.so 23110: 23110: 23110: initialize program: ./hello 23110: 23110: 23110: transferring control: ./hello 23110: hello! 23110: 23110: calling fini: ./hello [0] 23110: 23110: 23110: calling fini: /usr/lib/arm-linux-gnueabihf/libarmmem.so [0] 23110:

Agregue más información: edito el archivo architecture.S, y después de la marca que recibí:

gcc -std=gnu99 -O2 -c -o trampoline.o trampoline.c gcc -shared -o libarmmem.so architecture.o memcmp.o memcpymove.o memcpymove-a7.o memset.o trampoline.o `architecture'' referenced in section `.text'' of trampoline.o: defined in discarded section `.note.GNU-stack'' of architecture.o `architecture'' referenced in section `.text'' of trampoline.o: defined in discarded section `.note.GNU-stack'' of architecture.o `architecture'' referenced in section `.text'' of trampoline.o: defined in discarded section `.note.GNU-stack'' of architecture.o `architecture'' referenced in section `.text'' of trampoline.o: defined in discarded section `.note.GNU-stack'' of architecture.o collect2: error: ld returned 1 exit status Makefile:13: recipe for target ''libarmmem.so'' failed make: *** [libarmmem.so] Error 1