Hi,

Over the recent week, I have been working to get OSv to run a simple "hello 
world" app (aka native-example) built as a position-dependent statically 
linked executable. In essence, I picked up where Pekka Enberg left over 8 
years ago (see https://github.com/cloudius-systems/osv/tree/static-elf). 
Obviously, given these days OSv has pretty robust support of over 70 
syscalls (and 60 more that should be trivial to add), and the remaining 
work is much more manageable.

./scripts/firecracker.py -e /hello
OSv v0.57.0-37-g0de155a4
Booted up in 5.23 ms
Cmdline: /hello 
 -> syscall: 107
 -> syscall: 102
 -> syscall: 108
 -> syscall: 104
 -> syscall: 158
 -> syscall: 012
 -> syscall: 012
 -> syscall: 158
 -> syscall: 218
 -> syscall: 273
 -> syscall: 063
 -> syscall: 302
 -> syscall: 089
 -> syscall: 318
 -> syscall: 228
 -> syscall: 228
 -> syscall: 012
 -> syscall: 012
 -> syscall: 010
 -> syscall: 262
 -> syscall: 016
 -> syscall: 001
Hello from C code
 -> syscall: 231

I will be sending a series of proper patches later after I clean some 
issues but in essence here is a list of things I had to do including what 
Pekka started:

   1. Tweak dynamic linker to support static executable:
      - Handle missing DT_SYMTAB, DT_STRTAB and DT_NEEDED.
      - Handle ET_EXEC
      - Support statically-linked executable base address
   2. Add basic handling of static ELF entry point and initial stack state 
   setup (see figure 3.9 ("Initial Process Stack") of the x86-64 ABI 
   specification - https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf
      - make sure the RDX registers in zeroed and the basic AUX vector with 
      AT_RANDOM is set up
      - more is left to do to fully support argv and full aux vector
   3. Add support of the brk() syscall (see issue 1138)
   4. Add dummy support of sys_set_robust_list and set_tid_address syscalls 
   (possibly needs something more for multithreaded apps).
   5. Support the arch_prctl syscall that sets the app TLS 
      - this was by far the most complicated element that required changing 
      OSv to store new per-pcpu data pointer in GS register and enhancing both 
      syscall handler and interrupt/page fault handler to detect and switch if 
      needed the FS base to the kernel TLS on entry and back to the app one on 
      exit 
      (see 
https://github.com/cloudius-systems/osv/issues/1137#issuecomment-1512315880) 
   6. Fixing a potential bug in handling TCGETS in the console driver.
   7. Implement sys_prlimit
   8. Enable the readlink, geteuid and getegid

This was enough to run a single-threaded app but we will need to implement 
the clone syscall to support multi-threaded apps. In addition, we would 
want to support the static pies as well which I hope should not be very 
difficult.

Regards,
Waldek 

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to osv-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/3a561595-e072-4980-8375-3b742717dd6dn%40googlegroups.com.

Reply via email to