[ XDarko @ 21.10.2021. 11:19 ] @
Zravo svima, imam sledeci asemblerski kod u intelovoj sintaksi.

Kada ga prevedem sa as asemblerom dobijam tipa a.out fajl koji kad poikusam da izvrsim na ubuntu sa ./a.out dobijam "persmission denied".
A kada mu promenim mode sa chmod +x a.out, prilikom ./a.out dobijam "Exec format error"...

Moje pitanje je dakle sledece: Kako da pravilno prevedm i izvrsim ovaj prosti asemblerksi kod? Hvala na odgovoru.

.
Code:
       .intel_syntax noprefix

    .data

fmt:    .asciz "Hello, world!\n"

    .text

    .global main

main:
    enter 0, 0

    lea rdi, fmt
    call printf

    leave

    ret
 
[ dejanet @ 21.10.2021. 11:46 ] @
Nevezano za kod, da li si dao execution permission fajlu kada si probao da ga startujes na Ubuntu...

Ah, vec si pokusao, probaj
chmod 777 ......
[ djoka_l @ 21.10.2021. 15:12 ] @
chmod +x već radi dodvanje execute privilegije na fajl.
Nego, Darko, kako si kompajlirao i linkovao tvoj kod?
Šta ti vraća komanda:
file a.out

Meni liči da si samo kompajlirao, a nisi linkovao, nego si object kod nazvao a.out.
[ XDarko @ 21.10.2021. 17:17 ] @
Dakle kada ga prevedem sa as dobijam a.out fajl , a file a.out komanda ispisuje a.out: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
, sto meni nista ne znaci jer pojma nemam sa formatima objektnih fajlova. Kao sto rekoh prilikom chmod +x a.out i pokretanja dobijem sledece [bash: ./a.out: cannot execute binary file: Exec format error

Interesantno kada promenim ime funkcije iz 'main' u 'hekler' recimo, i pokusavam da prevedem sa gcc-om onda mi izbacuje linkersku gresku jer je nerazresena referenca na main funkciju...
[ djoka_l @ 21.10.2021. 17:39 ] @
Opet nisi odgovorio na pitanje:

Kako si preveo program?
Navedi KOMANDU kojom si kompajlirao i linkovao program.
Inače, ELF: https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
Primer šta meni daje "file" za izvršni fajl:
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
[ XDarko @ 21.10.2021. 18:05 ] @
Jesam nego nisi pazljivo citao.

Preveo sam ga sa "as" komandom tj sa programom odnosno sa gnu asemblerom. i kad ga prevedem dobijem a.out fajl, a kada ukucam komandu "file a.out" dobijem a.out: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped kao sto sam i napiso u prethodnoj poruci.

Sto se linkovanja tice pojma nemam sta treba i da li treba i kako treba nesto dodatno tu uraditi, inicijalno sam pretpostavio da ce kada pozovem gnu asembler nad datim kodom on obaviti prevodjenje do objektnog fajla i onda samoinicijativno uraditi i likovanje...
[ djoka_l @ 21.10.2021. 18:13 ] @
DAJ CELU LINIJU KOJOM SI PREVEO ASM FAJL.
Zaboga, pomozi mi da ti pomognem!
Na primer:

as file.s -o file.out
ld file.out -e main -o file
./file
[ XDarko @ 21.10.2021. 18:18 ] @
Haahh, prosto ovako:

as hello.s, kao izlaz dobijem difoltni a.out fajl i to je to.

A linker nigde nisam koristio.
[ sdurut @ 21.10.2021. 18:20 ] @
Asembler pravi samo OBJ tj objektni fajl. Obično se dodaje strartup kod kod koji inicijalizuje Stack pointer.
Mora da se pokrene linker da linkuje sve bibilioteke koje si koristio i napravi ELF izvršni fajl.
[ djoka_l @ 21.10.2021. 18:20 ] @
A što nisi linkovao?
Koristi "-o" opciju da ne bi dobio defaultni a.out.
Koristi linker.
Probaj ove komande koje sam ti ja dao, samo upotrebi prava imena fajlova.
[ XDarko @ 24.10.2021. 18:30 ] @
Ne znam kako da koristim linker tj, kako da linkujem da bibliotekom koja mi je potrebna.

Okej objektni fajl se ne zove vise a.out, stavio sam as -o hello.out hello.s, ali ne znam kako da linkujem...
[ djoka_l @ 24.10.2021. 19:00 ] @
ld hello.out -e main -o hello -lc

Možda ne treba -lc, ali printf je funkcija koja se nalazi u standardnoj biblioteci libc.so

A da probaš samo

make hello

[ XDarko @ 24.10.2021. 22:47 ] @
Hvala na odgovorima.

A da li postoji neka automatizacija tipa da linker sam zakljuci koja od biblioteka mu je potrebna pa da linkuje ili to mora manualno da se uradi?
[ djoka_l @ 24.10.2021. 22:51 ] @
Obično standardna biblioteka ne mora da se posebno navodi (libc, -lc)
Ostale biblioteke moraju da se navode.

Zaboga, probaj:
make hello

make zna da od .s treba da napravi .o fajl, a da od .o fajla napravi izvršni fajl. Zna da treba da linkuje .o fajl sa standardnom bibliotekom.
[ XDarko @ 24.10.2021. 22:56 ] @
Zahvaljujem.