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.
$ Datei Datengröße.o
datasize.o: ELF 64-Bit LSB verschiebbar, x86-64, Version 1 (SYSV), nicht entfernt
Nicht ausführbar: -
./Datengröße.o
bash: ./datasize.o: Berechtigung verweigert
Auch mit ldd
ldd Datengröße.o
ldd: Warnung: Sie haben keine Ausführungsberechtigung für „./datasize.o“, keine dynamische ausführbare Datei.
Ausgabe von strace
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 +++
Ausgabe von 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.
Antwort1
Tatsächlich können ".o"-Dateien ausgeführt werden, wenn sie nicht wirklich ".o"-Dateien sind. Wenn Sie also "ls" nach "ls.o" kopieren, können Sie ls.o ausführen und erhalten die Ausgabe des Befehls "ls". Übrigens, @jaychris, Sie möchten die Ausgabe einer Kompilierung wahrscheinlich nicht in eine "C"-Quelldatei einfügen. Siekönnte, aber wie bei einer ausführbaren Datei „ls.o“ kann es verwirrend sein.
Ich sehe im Originalbeitrag nichts, das darauf hinweist, dass die Datei, die der Benutzer ausführen möchte, über Ausführungsberechtigungen verfügt. Wenn der Autor ein „\ls -l datasize.o“ ausführen könnte, würde er zeigen, welche Berechtigungen er dafür hat.
Beachten Sie, dass das einfache Setzen des ausführbaren Bits (mit „chmod +x datasize.o“) es nicht zu einem ausführbaren Programm macht, wenn es sich wirklich um eine verknüpfbare Datei handelt. In diesem Fall können Sie, wenn datasize.o ein „main“ enthält, versuchen, was @jaychris angedeutet hat … verwenden Sie gcc -o datasize datasize.c … das erzeugt kein verknüpfbares „datasize.o“, sondern versucht, eine ausführbare Datei zu erstellen und sie in eine Datei namens „datasize“ zu legen (für die Sie mit „chmod +x datasize“ immer noch die Berechtigung „ausführbar“ aktivieren müssen).
Übrigens möchten Sie vielleicht die Manpage „chmod“ („man 1 chmod“) durchlesen.
Hoffe das hilft (?)...
Antwort2
.o-Dateien können nicht ausgeführt werden. Sie müssen verknüpft werden und die endgültige ausführbare Datei muss erstellt werden. Normalerweise geschieht dies mit „gcc -o file.c“, oder Kompilierung und Verknüpfung werden in separaten Schritten durchgeführt.