On Sun, Feb 06, 2022 at 03:36:49PM +0100, Gabriele Pelissetto wrote:
> Hi, I'm having problems running a program I wrote.
> I wrote this program that should just exit with exitcode 44:
> 
> // prog.S
> #include <sys/syscall.h>
>   .text
>   .globl _start
> _start:
>   subl $8, %esp
>   pushl $44
>   movl $SYS_exit, %eax
>   pushl $0
>   int $0x80
> 
> I compiled with
> 
> $ cc prog.S -nostdlib -o a.out
> 
> and run
> 
> $./a.out
> 
> Doing so on FreeBSD 13.0-RELEASE i386 (clang 11.0.1) worked fine.
> In fact, the executable runs and the exit code of the program is 44
> as it should be.
> 
> However, doing the same on OpenBSD 7.0 GENERIC.MP#5 i386
> and on NetBSD 9.2 i386 (gcc 7.5.0), the kernel refused to execute the
> code and it was passed to the shell, which of course failed:
> 
> openbsd$ ./a.out ./a.out[1]: syntax error: `(' unexpected
> 
> openbsd$ file a.out
> 
> a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
> statically linked, not stripped
> 
> openbsd$ objdump -d a.out
> 
> a.out:     file format elf32-i386
> 
> Disassembly of section .text:
> 
> 00001184 <_start>:
>   1184:   83 ec 08        sub    $0x8,%esp
>   1187:   6a 2c           push   $0x2c
>   1189:   b8 01 00 00 00  mov    $0x1,%eax
>   118e:   6a 00           push   $0x0
>   1190:   cd 80           int    $0x80
> 
> 
> I saw, however, that changing _start to main and compiling without
> -nostdlib worked fine.
> What am I doing wrong?

Hi,  I tried your asm program and came up with the following:

uranus$ cc -nostdlib -static -o asmtest asmtest.S
uranus$ file asmtest                              
asmtest: ELF 32-bit LSB shared object, Intel 80386, version 1
uranus$ ./asmtest
uranus$ echo $?
44

I believe this is what you want.  I had to add the following before the
.text section (based on my work with the RISCV group document found here:
https://github.com/pbug44/openbsd-riscv-misc/blob/master/init.S, originally
from Brian Bamsch):

.section ".note.openbsd.ident", "a"
    .p2align 2
    .long    8
    .long    4
    .long    1
    .ascii "OpenBSD\0"
    .long    0
    .previous

If you google for ".section \".note.openbsd.ident\"..."  you'll find a few
hits and they will explain to you how and why this works hopefully.

I'm very much a ASM newbie, so I can't tell you why this works exactly.  It
does modify the ELF sections though.

Best Regards,
-peter

Reply via email to