从main()返回值而不使用glibc

时间:2013-06-01 18:39:39

标签: c assembly

我试图在没有GLIBC的情况下编译时从main()返回一个值,但它不起作用。让我在互联网上找到这个例子:

[niko@localhost tests]$ cat stubstart.S 
.globl _start

_start:
    call main
    movl $1, %eax
    xorl %ebx, %ebx
    int $0x80
[niko@localhost tests]$ cat m.c
int main(int argc,char **argv) {

    return(90);

}
[niko@localhost tests]$ gcc -nostdlib stubstart.S -o m m.c 
[niko@localhost tests]$ ./m
[niko@localhost tests]$ echo $?
0
[niko@localhost tests]$ 

现在,如果我用GLIBC编译,我得到的返回值就好了:

[niko@localhost tests]$ gcc -o mglibc m.c
[niko@localhost tests]$ ./mglibc 
[niko@localhost tests]$ echo $?
90
[niko@localhost tests]$ 

所以,很明显,在stubstart.S中没有正确地完成返回,我该怎么做呢? (仅限Linux)

1 个答案:

答案 0 :(得分:4)

因为您没有向main()提供_exit()的返回值。

如果你这样做:

.globl _start

_start:
    call main
    movl %eax, %ebx
    movl $1, %eax
    int $0x80

您将返回值从eax保存到ebx,其中包含预期退出代码。