0
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.

$ file datasize.o

datasize.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

Not able to execute:-

./datasize.o

bash: ./datasize.o: Permission denied

Even with ldd

ldd datasize.o

ldd: warning: you do not have execution permission for `./datasize.o' not a dynamic executable

output of 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 +++

output of 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.
  • ls -al ./datasize.o , maybe stupid question , but have you correctly set executable permissions ? ( chmod a+x ./datasize.o ) – mimi.vx Jan 25 '17 at 16:07
1

Actually, ".o" files can be executed if they aren't really ".o" files. I.e. if you copy "ls" to "ls.o", you can execute ls.o and it will give you the output of the 'ls' command. BTW, @jaychris, you probably wouldn't want to put the output of a compile into a "C" source file. You could, but like having an executable "ls.o", it might be confusing.

I see nothing in the original posting that the file the user is trying to run has Executable permission. If the author could do a "\ls -l datasize.o, they show what permissions it has on it.

Note, simply setting the executable bit (with "chmod +x datasize.o"), won't make it a program that can be run if it is really a linkable file. In that case, if datasize.o has a "main" in it, you can try what @jaychris was hinting at ... use gcc -o datasize datasize.c ... that won't produce a linkable "datasize.o", but will try to create an executable and put it in a file called "datasize" (which you still have to enable "executable" permission on with "chmod +x datasize").

BTW, you might want to read up on the "chmod" manpage ("man 1 chmod").

Hope this helps (?)...

0

.o files cannot be executed. They need to linked and final executable need to be created. The way usually it is done is "gcc -o file.c" or compilation and linking is done in separate steps.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.