diff --git a/gnu/usr.bin/ld/rtld/rtld.1 b/gnu/usr.bin/ld/rtld/rtld.1 index 35d1c88431ff..a3734f9b66f5 100644 --- a/gnu/usr.bin/ld/rtld/rtld.1 +++ b/gnu/usr.bin/ld/rtld/rtld.1 @@ -106,7 +106,7 @@ library-name, major-version-number, minor-version-number recognises a number of environment variables that can be used to modify its behaviour as follows: .Pp -.Bl -tag -width "LD_TRACE_LOADED_OBJECTS_PROGNAME" +.Bl -tag -width "LD_IGNORE_MISSING_OBJECTS" .It Ev LD_LIBRARY_PATH A colon separated list of directories, overriding the default search path for shared libraries. @@ -134,6 +134,30 @@ object. This is usually indicative of an incorrectly built library. When set to a nonempty string, no warning messages of any kind are issued. Normally, a warning is given if satisfactorily versioned library could not be found. +.It Ev LD_IGNORE_MISSING_OBJECTS +When set to a nonempty string, makes it a nonfatal condition if +one or more required shared objects cannot be loaded. +Loading and execution proceeds using the objects that are +available. +A warning is produced for each missing object, unless the environment +variable +.Ev LD_SUPPRESS_WARNINGS +is set to a nonempty string. +.Pp +This is ignored for set-user-ID and set-group-ID programs. +.Pp +Missing shared objects can be ignored without errors if all the +following conditions hold: +.Bl -bullet +.It +They do not supply definitions for any required data symbols. +.It +No functions defined by them are called during program execution. +.It +The environment variable +.Ev LD_BIND_NOW +is unset or is set to the empty string. +.El .It Ev LD_TRACE_LOADED_OBJECTS When set to a nonempty string, causes .Nm diff --git a/gnu/usr.bin/ld/rtld/rtld.c b/gnu/usr.bin/ld/rtld/rtld.c index 6321a11ef1b4..b14e1fb03756 100644 --- a/gnu/usr.bin/ld/rtld/rtld.c +++ b/gnu/usr.bin/ld/rtld/rtld.c @@ -188,6 +188,7 @@ static int careful; static int anon_fd = -1; static char *ld_bind_now; +static char *ld_ignore_missing_objects; static char *ld_library_path; static char *ld_preload; static char *ld_tracing; @@ -869,6 +870,15 @@ map_sods(parent) * "not found" message. */ (void)alloc_link_map(NULL, sodp, parent, 0, 0); + } else if (ld_ignore_missing_objects) { + char *msg; + /* + * Call __dlerror() even it we're not going to use + * the message, in order to clear the saved message. + */ + msg = __dlerror(); /* Should never be NULL */ + if (!ld_suppress_warnings) + warnx("warning: %s", msg); } else /* Give up */ break; @@ -2022,6 +2032,7 @@ struct env_scan_tab { } scan_tab[] = { L("LD_LIBRARY_PATH=", 1, &ld_library_path) L("LD_PRELOAD=", 1, &ld_preload) + L("LD_IGNORE_MISSING_OBJECTS=", 1, &ld_ignore_missing_objects) L("LD_TRACE_LOADED_OBJECTS=", 0, &ld_tracing) L("LD_BIND_NOW=", 0, &ld_bind_now) L("LD_SUPPRESS_WARNINGS=", 0, &ld_suppress_warnings) diff --git a/libexec/rtld-aout/rtld.1 b/libexec/rtld-aout/rtld.1 index 35d1c88431ff..a3734f9b66f5 100644 --- a/libexec/rtld-aout/rtld.1 +++ b/libexec/rtld-aout/rtld.1 @@ -106,7 +106,7 @@ library-name, major-version-number, minor-version-number recognises a number of environment variables that can be used to modify its behaviour as follows: .Pp -.Bl -tag -width "LD_TRACE_LOADED_OBJECTS_PROGNAME" +.Bl -tag -width "LD_IGNORE_MISSING_OBJECTS" .It Ev LD_LIBRARY_PATH A colon separated list of directories, overriding the default search path for shared libraries. @@ -134,6 +134,30 @@ object. This is usually indicative of an incorrectly built library. When set to a nonempty string, no warning messages of any kind are issued. Normally, a warning is given if satisfactorily versioned library could not be found. +.It Ev LD_IGNORE_MISSING_OBJECTS +When set to a nonempty string, makes it a nonfatal condition if +one or more required shared objects cannot be loaded. +Loading and execution proceeds using the objects that are +available. +A warning is produced for each missing object, unless the environment +variable +.Ev LD_SUPPRESS_WARNINGS +is set to a nonempty string. +.Pp +This is ignored for set-user-ID and set-group-ID programs. +.Pp +Missing shared objects can be ignored without errors if all the +following conditions hold: +.Bl -bullet +.It +They do not supply definitions for any required data symbols. +.It +No functions defined by them are called during program execution. +.It +The environment variable +.Ev LD_BIND_NOW +is unset or is set to the empty string. +.El .It Ev LD_TRACE_LOADED_OBJECTS When set to a nonempty string, causes .Nm diff --git a/libexec/rtld-aout/rtld.1aout b/libexec/rtld-aout/rtld.1aout index 35d1c88431ff..a3734f9b66f5 100644 --- a/libexec/rtld-aout/rtld.1aout +++ b/libexec/rtld-aout/rtld.1aout @@ -106,7 +106,7 @@ library-name, major-version-number, minor-version-number recognises a number of environment variables that can be used to modify its behaviour as follows: .Pp -.Bl -tag -width "LD_TRACE_LOADED_OBJECTS_PROGNAME" +.Bl -tag -width "LD_IGNORE_MISSING_OBJECTS" .It Ev LD_LIBRARY_PATH A colon separated list of directories, overriding the default search path for shared libraries. @@ -134,6 +134,30 @@ object. This is usually indicative of an incorrectly built library. When set to a nonempty string, no warning messages of any kind are issued. Normally, a warning is given if satisfactorily versioned library could not be found. +.It Ev LD_IGNORE_MISSING_OBJECTS +When set to a nonempty string, makes it a nonfatal condition if +one or more required shared objects cannot be loaded. +Loading and execution proceeds using the objects that are +available. +A warning is produced for each missing object, unless the environment +variable +.Ev LD_SUPPRESS_WARNINGS +is set to a nonempty string. +.Pp +This is ignored for set-user-ID and set-group-ID programs. +.Pp +Missing shared objects can be ignored without errors if all the +following conditions hold: +.Bl -bullet +.It +They do not supply definitions for any required data symbols. +.It +No functions defined by them are called during program execution. +.It +The environment variable +.Ev LD_BIND_NOW +is unset or is set to the empty string. +.El .It Ev LD_TRACE_LOADED_OBJECTS When set to a nonempty string, causes .Nm diff --git a/libexec/rtld-aout/rtld.c b/libexec/rtld-aout/rtld.c index 6321a11ef1b4..b14e1fb03756 100644 --- a/libexec/rtld-aout/rtld.c +++ b/libexec/rtld-aout/rtld.c @@ -188,6 +188,7 @@ static int careful; static int anon_fd = -1; static char *ld_bind_now; +static char *ld_ignore_missing_objects; static char *ld_library_path; static char *ld_preload; static char *ld_tracing; @@ -869,6 +870,15 @@ map_sods(parent) * "not found" message. */ (void)alloc_link_map(NULL, sodp, parent, 0, 0); + } else if (ld_ignore_missing_objects) { + char *msg; + /* + * Call __dlerror() even it we're not going to use + * the message, in order to clear the saved message. + */ + msg = __dlerror(); /* Should never be NULL */ + if (!ld_suppress_warnings) + warnx("warning: %s", msg); } else /* Give up */ break; @@ -2022,6 +2032,7 @@ struct env_scan_tab { } scan_tab[] = { L("LD_LIBRARY_PATH=", 1, &ld_library_path) L("LD_PRELOAD=", 1, &ld_preload) + L("LD_IGNORE_MISSING_OBJECTS=", 1, &ld_ignore_missing_objects) L("LD_TRACE_LOADED_OBJECTS=", 0, &ld_tracing) L("LD_BIND_NOW=", 0, &ld_bind_now) L("LD_SUPPRESS_WARNINGS=", 0, &ld_suppress_warnings) diff --git a/libexec/rtld-elf/rtld.1 b/libexec/rtld-elf/rtld.1 index 35d1c88431ff..a3734f9b66f5 100644 --- a/libexec/rtld-elf/rtld.1 +++ b/libexec/rtld-elf/rtld.1 @@ -106,7 +106,7 @@ library-name, major-version-number, minor-version-number recognises a number of environment variables that can be used to modify its behaviour as follows: .Pp -.Bl -tag -width "LD_TRACE_LOADED_OBJECTS_PROGNAME" +.Bl -tag -width "LD_IGNORE_MISSING_OBJECTS" .It Ev LD_LIBRARY_PATH A colon separated list of directories, overriding the default search path for shared libraries. @@ -134,6 +134,30 @@ object. This is usually indicative of an incorrectly built library. When set to a nonempty string, no warning messages of any kind are issued. Normally, a warning is given if satisfactorily versioned library could not be found. +.It Ev LD_IGNORE_MISSING_OBJECTS +When set to a nonempty string, makes it a nonfatal condition if +one or more required shared objects cannot be loaded. +Loading and execution proceeds using the objects that are +available. +A warning is produced for each missing object, unless the environment +variable +.Ev LD_SUPPRESS_WARNINGS +is set to a nonempty string. +.Pp +This is ignored for set-user-ID and set-group-ID programs. +.Pp +Missing shared objects can be ignored without errors if all the +following conditions hold: +.Bl -bullet +.It +They do not supply definitions for any required data symbols. +.It +No functions defined by them are called during program execution. +.It +The environment variable +.Ev LD_BIND_NOW +is unset or is set to the empty string. +.El .It Ev LD_TRACE_LOADED_OBJECTS When set to a nonempty string, causes .Nm