Segmentation fault on push inside a function x86_64 GAS

For C and ASSEMBLY users to post questions and code snippets for programming in C and ASSEMBLY. And for any other C or ASM course related questions.

Moderators: Benj, Mods

katherineamt
Posts: 1
Joined: Sat Nov 17, 2018 5:09 pm
Contact:

Segmentation fault on push inside a function x86_64 GAS

Postby katherineamt » Sat Nov 17, 2018 5:25 pm

I have a little program that just adds an item to the stack and then enters a function to add another one. The problem is that it has a weird behaviour every time you execute it.

Here is the function:

Code: Select all

.section .data

.section .text

.globl _start
_start:
    # Push
    push $1
    # Function call
    call pfun
    movq $60, %rax
    syscall

.type pfun, @function
pfun:
    # Push
    push $2
    # Return
    ret

Nothing complex at all, but will fail giving a Segmentation fault and if you try to debug it you will find that the error occurs when the program enters inside the function but it will not have any info about where it's located.

Program received signal SIGSEGV, Segmentation fault. 0x0000000000000002 in ?? ()

Now, if you add a "pop" after the function push and run it then it will build and run successfully. BUT if you debug it you will see that it never gets inside the function using the "n"(next) command.

I've searched for an answer but didn't found anything similar at all for ASM. Recently started learning ASM and for me it looks perfectly nice so don't really know why it could be happening.

Any help here is appreciated. Thank you.

mnf
Valued Contributor
Valued Contributor
Posts: 514
Joined: Wed May 31, 2017 11:57 am
Has thanked: 52 times
Been thanked: 285 times
Contact:

Re: Segmentation fault on push inside a function x86_64 GAS

Postby mnf » Sat Nov 17, 2018 5:52 pm

Hi Katherine,

When you push $2, this is becoming the return address for pfun. Is this what you intended? Returning to address 2 will surely give a fault.

If the intention is to pass an argument to pfun and then return a result you'll need to avoid the return address on the stack and also tidy up after using pop.

Martin