ld.so.1(1) on Solnix vs Linux and the BSDs
On Solnix the runtime linker is the illumos /lib/ld.so.1, which the kernel runs as the interpreter of dynamic executables. Run directly, it takes only -e envar, so Linux-style options such as --list or --library-path do not exist. Configuration comes from crle(1)-built files under /var/ld, not ldconfig hints or ld.so.cache.
The manual pages
- Solnix: ld.so.1(1) from
pkgs.solnix.illumos-world-man· illumos.org - Linux: ld.so(8) man-pages-6.18 (different command, similar job)
- FreeBSD: rtld(1) 15.1-RELEASE (different command, similar job)
- OpenBSD: ld.so(1) 8.0 (different command, similar job)
- NetBSD: ld.elf_so(1) 11.0 (different command, similar job)
What Solnix runs
A default Solnix system runs the illumos /lib/ld.so.1. The bundle lists no other variants. The page is published in pkgs.solnix.illumos-world-man. The bundle text is trimmed, so only the parts shown are compared here.
Differences
| Compared with | Topic | What differs |
|---|---|---|
| Linux | command-line options | Run directly, Solnix ld.so.1 accepts only -e envar, then the object and its arguments. Linux ld.so has --list, --library-path, --preload, --audit, --inhibit-cache, --argv0 and others. Solnix sets such behaviour through environment variables.Source: Solnix ld.so.1(1) SYNOPSIS, Command Line Usage (-e); Linux ld.so(8) SYNOPSIS, OPTIONS |
| FreeBSD, OpenBSD, NetBSD | direct invocation options | Solnix documents a direct-invocation form with one option, -e envar, to set a linker environment variable. The FreeBSD, OpenBSD and NetBSD pages show no SYNOPSIS or options for running the linker directly; they only describe environment variables.Source: Solnix ld.so.1(1) -e; FreeBSD rtld(1) DESCRIPTION; OpenBSD ld.so(1) DESCRIPTION; NetBSD ld.elf_so(1) ENVIRONMENT |
| all four | linker path and name | The Solnix interpreter is /lib/ld.so.1. Linux uses /lib/ld-linux.so.*, FreeBSD names it ld-elf.so.1 (also ld.so and rtld), and OpenBSD and NetBSD name it ld.so and ld.elf_so. A hard-coded interpreter path will not carry across.Source: Solnix ld.so.1(1) SYNOPSIS; Linux ld.so(8) SYNOPSIS; FreeBSD rtld(1) NAME; OpenBSD ld.so(1) NAME; NetBSD ld.elf_so(1) NAME |
| Linux, FreeBSD, OpenBSD | configuration file vs cache or hints | Solnix reads /var/ld/ld.config (32-bit) or /var/ld/64/ld.config (64-bit), built with crle(1) and overridable with LD_CONFIG. Linux uses /etc/ld.so.cache from ldconfig(8). FreeBSD and OpenBSD use an ldconfig(8) hints file.Source: Solnix ld.so.1(1) DESCRIPTION, LD_CONFIG; Linux ld.so(8) search order (4); FreeBSD rtld(1) search order 5; OpenBSD ld.so(1) DESCRIPTION |
| all four | default library directories | Solnix 32-bit objects default to /lib then /usr/lib; 64-bit objects use /lib/64 then /usr/lib/64. Linux uses /lib64 and /usr/lib64 on some 64-bit architectures. OpenBSD and NetBSD list only /usr/lib as the final default.Source: Solnix ld.so.1(1) DESCRIPTION (search path); Linux ld.so(8) (5); OpenBSD ld.so(1) list item 4; NetBSD ld.elf_so(1) Finding objects item 3 |
| all four | search order | Solnix searches the runpath recorded in the object, then the defaults, with LD_LIBRARY_PATH directories searched before the defaults. Linux and FreeBSD check DT_RPATH first. OpenBSD searches LD_LIBRARY_PATH first; NetBSD does LD_LIBRARY_PATH and ld.so.conf first. Source: Solnix ld.so.1(1) DESCRIPTION (default search paths); Linux ld.so(8) (1)-(5); FreeBSD rtld(1) list; OpenBSD ld.so(1) list; NetBSD ld.elf_so(1) Finding objects |
| FreeBSD | 32-bit environment variables | Solnix selects 32-bit or 64-bit scope with a _32 or _64 suffix, e.g. LD_BIND_NOW_64, and a suffixed variable overrides the plain one. FreeBSD uses an LD_32_ prefix for 32-bit objects, e.g. LD_32_TRACE_LOADED_OBJECTS. Source: Solnix ld.so.1(1) ENVIRONMENT VARIABLES; FreeBSD rtld(1) DESCRIPTION (LD_32_) |
| all four | binding mode variables | Solnix has LD_BIND_LAZY and LD_BIND_NOW; if both are set, LD_BIND_NOW wins. OpenBSD and NetBSD document LD_BIND_NOW only. The Linux and FreeBSD text shown does not cover LD_BIND_LAZY. Lazy binding is the Solnix default. Source: Solnix ld.so.1(1) LD_BIND_LAZY, LD_BIND_NOW; OpenBSD ld.so(1) LD_BIND_NOW; NetBSD ld.elf_so(1) LD_BIND_NOW |
| all four | path expansion tokens | The Solnix text shown does not list $ORIGIN-style tokens. Linux expands $ORIGIN, $LIB and $PLATFORM. FreeBSD adds $OSNAME and $OSREL. NetBSD also lists $HWCAP and $ISALIST, both unimplemented. Check the full Solnix page before using tokens. Source: Linux ld.so(8) Dynamic string tokens; FreeBSD rtld(1) DESCRIPTION; NetBSD ld.elf_so(1) Finding objects |
| OpenBSD | listing dependencies | OpenBSD ld.so exits after printing the loaded objects when LD_TRACE_LOADED_OBJECTS is set, which ldd(1) uses. The Solnix text shown points to ldd(1) for dependency and initialization order and documents no equivalent variable. Source: OpenBSD ld.so(1) LD_TRACE_LOADED_OBJECTS; Solnix ld.so.1(1) DESCRIPTION (ldd(1)) |
| NetBSD | dlopen search path | NetBSD dlopen(3) uses the DT_RPATH and DT_RUNPATH of the main binary, whichever object made the call. The Solnix text shown does not state this rule for dlopen(3C). Source: NetBSD ld.elf_so(1) Finding objects; Solnix ld.so.1(1) DESCRIPTION |
Everyday tasks
| Task | Solnix | Linux | FreeBSD | OpenBSD | NetBSD |
|---|---|---|---|---|---|
| list a program's shared-object dependencies | ldd(1) | ld.so --list | — | LD_TRACE_LOADED_OBJECTS (used by ldd(1)) | — |
| search a directory first for one run | LD_LIBRARY_PATH=dir | ld.so --library-path path | LD_LIBRARY_PATH=dir | LD_LIBRARY_PATH=dir | LD_LIBRARY_PATH=dir |
| change system-wide linker search configuration | crle(1) (writes /var/ld/ld.config) | ldconfig(8), /etc/ld.so.conf | ldconfig(8) hints file | ldconfig(8) | ld.so.conf(5) |
| bind all symbols at startup | LD_BIND_NOW=1 | — | — | LD_BIND_NOW=1 | LD_BIND_NOW=1 |
Standards
- POSIX: ld.so.1 is not a POSIX.1-2024 utility.
- OpenBSD: HISTORY: the shared library model first appeared in SunOS 4.0.
- NetBSD: HISTORY: the ELF shared library model first appeared in Sys V R4; the path expansion variables first appeared in Solaris 10 and NetBSD 5.0.
Writing portable scripts
- Do not run the linker by name in scripts. Use ldd(1) or let the kernel pick the interpreter, because the path and the options differ on every system.
- Set LD_LIBRARY_PATH and LD_BIND_NOW as environment variables for portable behaviour; avoid Linux ld.so options and Solnix-only _32/_64 suffixes.
Every difference here is taken from the manual pages linked above: Solnix's published page, Linux (man-pages and the GNU and util-linux manuals), FreeBSD, OpenBSD and NetBSD. Each row names its source. Where a manual is silent, this page is too. Compiled 2026-10-26. Found a mistake? Mail hackers@lists.solnix.io.