tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Sharing ELF definitions between NetBSD userspace and kernel



Hello tech-kern and tech-userlevel,

I would like to discuss ways to implement the following two goals:

Goal 1: To wean userland off the use of <sys/exec_elf.h> (a kernel
  header).

Goal 2: To have a single set of definitions for 'generic' ELF symbols,
  for consistency across NetBSD's userspace and kernel.

Where we are currently:

- Currently, userland code in NetBSD expects the kernel header
  <sys/exec_elf.h> to implement ELF-related symbols.

  However, from the POV of the kernel, almost all of the content of
  this file is clutter -- only a small portion of the content in
  <sys/exec_elf.h> is actually relevant to the kernel.

- The contents of <sys/exec_elf.h> could be grouped into the following
  categories:

  A) Symbols and definitions that need to be consistent across OSes
     for interoperability - the 'generic' set of definitions, further
     subdivided into:

     A1) Symbols that are 'generic' but are NOT used by NetBSD kernel
         code.

     A2) Symbols and definitions that are 'generic', and are used by
     	 the kernel.

  B) NetBSD-local symbols used by userland only.

  C) NetBSD-local symbols needed by both userland and the kernel
     (e.g. the definitions needed for implementing execve(2)).

  D) Kernel-only symbols which are in an #ifdef _KERNEL block.  This
     set is not relevant to this discussion.


For goal 1, we could offer a user header <elf.h>.

Implementing <elf.h> would be straightforward:

- The definitions for the 'generic' sets [A1, A2] are available in
  <sys/elfdefinitions.h> (via external/bsd/elftoolchain), which
  <elf.h> could #include.

- The symbols in set [B] can be moved over from <sys/exec_elf.h>.

Pros:
- Eases porting of third-party code that expects to use an
  <elf.h>.

- Removes the dependency the use of a kernel header.

Cons: (I can't think of a serious con.)


For goal 2, we have the following options (at least):

Option 1: Have <sys/exec_elf.h> include <sys/elfdefinitions.h>
  for 'generic' symbols.

  Something like:
  
    Index: exec_elf.h
    ===================================================================
    RCS file: /cvsroot/src/sys/sys/exec_elf.h,v
    retrieving revision 1.183
    diff -u -r1.183 exec_elf.h
    --- exec_elf.h	18 Nov 2025 13:02:13 -0000	1.183
    +++ exec_elf.h	25 Nov 2025 13:58:30 -0000
    @@ -53,6 +53,8 @@
     #include <stddef.h>
     #endif /* _KERNEL || _STANDALONE */

    +#include <sys/elfdefinitions.h>
    +
     #if HAVE_NBTOOL_CONFIG_H
     #include <nbinclude/machine/elf_machdep.h>
     #else

  This is how some OSes keep userland and the kernel consistent:
  e.g. FreeBSD's userland header <elf.h> includes <sys/elf*.h>, and
  OpenSolaris's <elf.h> brings in <sys/elf.h>.

  The 'generic' definitions currently in <sys/exec_elf.h> can
  then be removed from the file.

  Pros:
  - <sys/exec_elf.h> can become smaller and narrower in focus.

  - Existing third-party code that uses <sys/exec_elf.h> for accessing
    'generic' ELF symbols will continue to compile; such code can
    gradually be adapted to use <elf.h>.

  Cons:
  - This approach requires the Elftoolchain header
    <sys/elfdefinitions.h> to be made available to the kernel build.


Option 2: Manually or semi-automatically maintain all of the 'generic'
  ELF symbols currently present in <sys/exec_elf.h>, say by using a
  script that keeps these symbols in sync with userland.

  Pros:
  - Does not need the kernel build process to change.

  - Application code that uses <sys/exec_elf.h> for 'generic'
    symbols will continue to compile.

  Cons:
  - Non-kernel clutter remains in <sys/exec_elf.h>.

  - Manual steps would be needed to keep the file up to date.

  - Potential for subtle bugs in the future.


Option 3: Like option 2 above but in this option <sys/exec_elf.h> is
  trimmed down to *only* contain the symbols used by the kernel (i.e.
  only the sets [A2], [C] and [D])

  This forces userland code to use <elf.h>.

  Pros:
  - Keeps the kernel header clean and minimal.

  - <sys/elfdefinitions.h> does not need to be available at kernel
    build time.

  - Fewer 'generic' symbols to keep up to date.

  Cons:
  - Breaks third-party code that expects generic ELF symbols to
    be provided by <sys/exec_elf.h>.

  - Extra manual steps to maintain the file (like in option 2).

  - A small amount of symbol duplication remains.


Thoughts/comments?

Regards,
Joseph Koshy | jkoshy%netbsd.org@localhost


Home | Main Index | Thread Index | Old Index