[Bug c/63318] New: Hello World C program using inline assembly to invoke write(2) on amd64 Linux fails to print Hello World
ryao at gentoo dot org
gcc-bugzilla@gcc.gnu.org
Sat Sep 20 19:13:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63318
Bug ID: 63318
Summary: Hello World C program using inline assembly to invoke
write(2) on amd64 Linux fails to print Hello World
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: ryao at gentoo dot org
Host: x86_64-pc-linux-gnu
Target: x86_64-pc-linux-gnu
Build: x86_64-pc-linux-gnu
Created attachment 33522
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33522&action=edit
A hello world program from stack overflow
I tried building a Hello World program from stack overflow that used asm
volatile to invoke write(2):
https://stackoverflow.com/questions/9506353/how-to-invoke-a-system-call-via-sysenter-in-inline-assembly-x86-amd64-linux/9508738#9508738
Unfortunately, it fails to print Hello World when compiled with GCC, but prints
Hello World fine when compiled with Clang. This is because GCC fails to emit a
string, while Clang does not.
Here is the assembly output of GCC:
$ gcc -S -o - syscall.c
.file "syscall.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $48, %rsp
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
movabsq $8022916924116329800, %rax
movq %rax, -32(%rbp)
movl $560229490, -24(%rbp)
movw $10, -20(%rbp)
movq $14, -48(%rbp)
leaq -32(%rbp), %rax
#APP
# 8 "syscall.c" 1
movl $1, %eax
movl $1, %edi
movq %rax, %rsi
movl -48(%rbp), %edx
syscall
# 0 "" 2
#NO_APP
movq %rax, -40(%rbp)
movl $0, %eax
movq -8(%rbp), %rdx
xorq %fs:40, %rdx
je .L3
call __stack_chk_fail
.L3:
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Gentoo 4.8.3 p1.1, pie-0.5.9) 4.8.3"
.section .note.GNU-stack,"",@progbits
And here is the assembly output of Clang:
$ clang -S -o - syscall.c
.file "syscall.c"
.text
.globl main
.align 16, 0x90
.type main,@function
main: # @main
.cfi_startproc
# BB#0:
pushq %rbp
.Ltmp2:
.cfi_def_cfa_offset 16
.Ltmp3:
.cfi_offset %rbp, -16
movq %rsp, %rbp
.Ltmp4:
.cfi_def_cfa_register %rbp
movl $0, %eax
movl $0, -4(%rbp)
movq $14, -16(%rbp)
movl %eax, -28(%rbp) # 4-byte Spill
#APP
movl $1, %eax
movl $1, %edi
movq $main.hello, %rsi
movl $14, %edx
syscall
#NO_APP
movq %rax, -24(%rbp)
movl -28(%rbp), %eax # 4-byte Reload
popq %rbp
ret
.Ltmp5:
.size main, .Ltmp5-main
.cfi_endproc
.type main.hello,@object # @main.hello
.section .rodata,"a",@progbits
main.hello:
.asciz "Hello World!\n"
.size main.hello, 14
.section ".note.GNU-stack","",@progbits
Here is information on my compiler versions:
$ clang -v
clang version 3.3 (tags/RELEASE_33/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
$ gcc -v
Using built-in specs.
COLLECT_GCC=/usr/x86_64-pc-linux-gnu/gcc-bin/4.8.3/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/4.8.3/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /var/tmp/portage/sys-devel/gcc-4.8.3/work/gcc-4.8.3/configure
--host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --prefix=/usr
--bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/4.8.3
--includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/include
--datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.8.3
--mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.8.3/man
--infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.8.3/info
--with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/include/g++-v4
--with-python-dir=/share/gcc-data/x86_64-pc-linux-gnu/4.8.3/python
--enable-languages=c,c++,fortran --enable-obsolete --enable-secureplt
--disable-werror --with-system-zlib --enable-nls --without-included-gettext
--enable-checking=release --with-bugurl=https://bugs.gentoo.org/
--with-pkgversion='Gentoo 4.8.3 p1.1, pie-0.5.9' --enable-libstdcxx-time
--enable-shared --enable-threads=posix --enable-__cxa_atexit
--enable-clocale=gnu --enable-multilib --with-multilib-list=m32,m64
--disable-altivec --disable-fixed-point --enable-targets=all --disable-libgcj
--enable-libgomp --disable-libmudflap --disable-libssp --enable-lto
--without-cloog
Thread model: posix
gcc version 4.8.3 (Gentoo 4.8.3 p1.1, pie-0.5.9)
More information about the Gcc-bugs
mailing list