![Error "No existe tal archivo o directorio" al ejecutar un binario que también muestra permiso denegado](https://rvso.com/image/1518668/Error%20%22No%20existe%20tal%20archivo%20o%20directorio%22%20al%20ejecutar%20un%20binario%20que%20tambi%C3%A9n%20muestra%20permiso%20denegado.png)
I was just trying to execute a simple program **.c** program on **OPNESUSE-42.1**
I did the following set of commands in which showing **Permission Denied** and also showing **relocatable** i am not able to understand that how it becomes relocatable file.
$ tamaño de datos del archivo.o
datasize.o: ELF LSB de 64 bits reubicable, x86-64, versión 1 (SYSV), no eliminado
No se puede ejecutar: -
./tamaño de datos.o
bash: ./datasize.o: Permiso denegado
Incluso con ldd
ldd tamaño de datos.o
ldd: advertencia: no tiene permiso de ejecución para `./datasize.o', no es un ejecutable dinámico
salida de traza
strace ./datasize.o
execve("./datasize.o", ["./datasize.o"], [/* 87 vars */]) = -1 EACCES (Permission denied)
write(2, "strace: exec: Permission denied\n", 32strace: exec: Permission denied
) = 32
exit_group(1) = ?
+++ exited with 1 +++
salida de readelf: -
readelf -a ./datasize.o
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 1040 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 64 (bytes)
Number of section headers: 13
Section header string table index: 10
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .text PROGBITS 0000000000000000 00000040
000000000000009c 0000000000000000 AX 0 0 1
[ 2] .rela.text RELA 0000000000000000 00000318
0000000000000078 0000000000000018 I 11 1 8
[ 3] .data PROGBITS 0000000000000000 000000dc
0000000000000000 0000000000000000 WA 0 0 1
[ 4] .bss NOBITS 0000000000000000 000000dc
0000000000000000 0000000000000000 WA 0 0 1
[ 5] .rodata PROGBITS 0000000000000000 000000e0
0000000000000087 0000000000000000 A 0 0 8
[ 6] .comment PROGBITS 0000000000000000 00000167
0000000000000019 0000000000000001 MS 0 0 1
[ 7] .note.GNU-stack PROGBITS 0000000000000000 00000180
0000000000000000 0000000000000000 0 0 1
[ 8] .eh_frame PROGBITS 0000000000000000 00000180
0000000000000038 0000000000000000 A 0 0 8
[ 9] .rela.eh_frame RELA 0000000000000000 00000390
0000000000000018 0000000000000018 I 11 8 8
[10] .shstrtab STRTAB 0000000000000000 000003a8
0000000000000061 0000000000000000 0 0 1
[11] .symtab SYMTAB 0000000000000000 000001b8
0000000000000138 0000000000000018 12 9 8
[12] .strtab STRTAB 0000000000000000 000002f0
0000000000000023 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
There are no section groups in this file.
There are no program headers in this file.
Relocation section '.rela.text' at offset 0x318 contains 5 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000023 000a00000002 R_X86_64_PC32 0000000000000000 uname - 4
000000000028 00050000000a R_X86_64_32 0000000000000000 .rodata + 0
00000000002d 000b00000002 R_X86_64_PC32 0000000000000000 puts - 4
000000000087 00050000000a R_X86_64_32 0000000000000000 .rodata + 48
000000000091 000c00000002 R_X86_64_PC32 0000000000000000 printf - 4
Relocation section '.rela.eh_frame' at offset 0x390 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 000200000002 R_X86_64_PC32 0000000000000000 .text + 0
The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported.
Symbol table '.symtab' contains 13 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS datasize.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 3
4: 0000000000000000 0 SECTION LOCAL DEFAULT 4
5: 0000000000000000 0 SECTION LOCAL DEFAULT 5
6: 0000000000000000 0 SECTION LOCAL DEFAULT 7
7: 0000000000000000 0 SECTION LOCAL DEFAULT 8
8: 0000000000000000 0 SECTION LOCAL DEFAULT 6
9: 0000000000000000 156 FUNC GLOBAL DEFAULT 1 main
10: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND uname
11: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND puts
12: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND printf
No version information found in this file.
Respuesta1
En realidad, los archivos ".o" se pueden ejecutar si en realidad no son archivos ".o". Es decir, si copia "ls" a "ls.o", puede ejecutar ls.o y le dará el resultado del comando 'ls'. Por cierto, @jaychris, probablemente no quieras poner el resultado de una compilación en un archivo fuente "C". Túpodría, pero al igual que tener un ejecutable "ls.o", puede resultar confuso.
No veo nada en la publicación original que indique que el archivo que el usuario está intentando ejecutar tenga permiso ejecutable. Si el autor pudiera hacer "\ls -l datasize.o, mostraría qué permisos tiene sobre él.
Tenga en cuenta que simplemente configurar el bit ejecutable (con "chmod +x datasize.o") no lo convertirá en un programa que se pueda ejecutar si realmente es un archivo vinculable. En ese caso, si datasize.o tiene un "main", puede probar lo que @jaychris estaba insinuando... use gcc -o datasize datasize.c... eso no producirá un "datasize.o enlazable". ", pero intentará crear un ejecutable y colocarlo en un archivo llamado "datasize" (en el que aún debe habilitar el permiso "ejecutable" con "chmod +x datasize").
Por cierto, es posible que desees leer la página de manual "chmod" ("man 1 chmod").
Espero que esto ayude (?)...
Respuesta2
Los archivos .o no se pueden ejecutar. Deben vincularse y crearse el ejecutable final. La forma habitual de hacerlo es "gcc -o file.c" o la compilación y el enlace se realizan en pasos separados.