How do you assemble, link and run a .s file in linux?
I'm getting a weird error message when trying to assemble and run a .s file using AT&T Intel Syntax. Not sure if I'm even using the correct architecture to begin with, or if I'm having syntax errors, if I'm not using the correct commands to assemble and link, etc. Completely lost and I do not know where to begin.
So basically, I have a file called yea.s , which contains some simple assembler instructions. I then try to compile it using the command
as yea.s -o yea.o and then link is using
ld yea.o -o yea. When running ld, I get this weird message:
ld: warning: cannot find entry symbol _start; defaulting to 000000440000.
This is the program im trying to run, very simple and doesn't really do anything.
resMsg: .asciz "xxxxxxxx" .text .global main main: pushq $0 ret
I just cannot figure out what's going on. Obviously, this is for school homework. I'm not looking for the answer to the homework, obviously, but this is the starting point to where I can actually start the coding. And I just cant figure out how to simple run the program, which it doesn't say in the assignment. Anyway, thanks in advance guys!
Linux executables require an entry point to be specified. The entry point is the address of the first instruction to be executed in your program. If not specified otherwise, the link editor looks for a symbol named
_start to use as an entry point. Your program does not contain such a symbol, thus the linker complains and picks the beginning of the
.text section as the entry point. To fix this problem, rename
Note further that unlike on DOS, there is nothing to return to from
_start. So your attempt to return is going to cause a crash. Instead, call the system call
sys_exit to exit the program:
mov $0, %edi # exit status mov $60, %eax # system call number syscall # perform exit call
Alternatively, if you want to use the C runtime environment and call functions from the C library, leave your program as is and instead assemble and link using the C compiler driver
cc -o yea yea.s
If you do so, the C runtime environment provides the entry point for you and eventually tries to call a function
main which is where your code comes in. This approach is required if you want to call functions from the C library. If you do it this way, make sure that
main follows the SysV ABI (calling convention).
Note that even then your code is incorrect. The return value of a function is given in the
rax) register and not pushed on the stack. To return zero from
mov $0, %eax # exit status ret # return from function