svn commit: r361881 - stable/12/libexec/rtld-elf
Konstantin Belousov
kib at FreeBSD.org
Sun Jun 7 00:41:44 UTC 2020
Author: kib
Date: Sun Jun 7 00:41:43 2020
New Revision: 361881
URL: https://svnweb.freebsd.org/changeset/base/361881
Log:
MFC r361672, r361675, r361676, r361680:
rtld direct exec: add -b and -v options.
Modified:
stable/12/libexec/rtld-elf/rtld.1
stable/12/libexec/rtld-elf/rtld.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/libexec/rtld-elf/rtld.1
==============================================================================
--- stable/12/libexec/rtld-elf/rtld.1 Sun Jun 7 00:07:21 2020 (r361880)
+++ stable/12/libexec/rtld-elf/rtld.1 Sun Jun 7 00:41:43 2020 (r361881)
@@ -28,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd May 20, 2017
+.Dd June 1, 2020
.Dt RTLD 1
.Os
.Sh NAME
@@ -302,6 +302,7 @@ Execution options may be specified.
The syntax of the direct invocation is
.Bd -ragged -offset indent
.Pa /libexec/ld-elf.so.1
+.Op Fl b Ar exe
.Op Fl f Ar fd
.Op Fl p
.Op Fl -
@@ -311,6 +312,17 @@ The syntax of the direct invocation is
.Pp
The options are:
.Bl -tag -width indent
+.It Fl b Ar exe
+Use the executable
+.Fa exe
+instead of
+.Fa image_path
+for activation.
+If this option is specified,
+.Ar image_path
+is only used to provide the
+.Va argv[0]
+value to the program.
.It Fl f Ar fd
File descriptor
.Ar fd
@@ -333,6 +345,8 @@ character,
uses the search path provided by the environment variable
.Dv PATH
to find the binary to execute.
+.It Fl v
+Display information about this run-time linker binary, then exit.
.It Fl -
Ends the
.Nm
Modified: stable/12/libexec/rtld-elf/rtld.c
==============================================================================
--- stable/12/libexec/rtld-elf/rtld.c Sun Jun 7 00:07:21 2020 (r361880)
+++ stable/12/libexec/rtld-elf/rtld.c Sun Jun 7 00:41:43 2020 (r361881)
@@ -136,7 +136,8 @@ static void objlist_put_after(Objlist *, Obj_Entry *,
static void objlist_remove(Objlist *, Obj_Entry *);
static int open_binary_fd(const char *argv0, bool search_in_path,
const char **binpath_res);
-static int parse_args(char* argv[], int argc, bool *use_pathp, int *fdp);
+static int parse_args(char* argv[], int argc, bool *use_pathp, int *fdp,
+ const char **argv0);
static int parse_integer(const char *);
static void *path_enumerate(const char *, path_enum_proc, const char *, void *);
static void print_usage(const char *argv0);
@@ -439,8 +440,7 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entr
}
dbg("opening main program in direct exec mode");
if (argc >= 2) {
- rtld_argc = parse_args(argv, argc, &search_in_path, &fd);
- argv0 = argv[rtld_argc];
+ rtld_argc = parse_args(argv, argc, &search_in_path, &fd, &argv0);
explicit_fd = (fd != -1);
binpath = NULL;
if (!explicit_fd)
@@ -5563,15 +5563,20 @@ open_binary_fd(const char *argv0, bool search_in_path,
* Parse a set of command-line arguments.
*/
static int
-parse_args(char* argv[], int argc, bool *use_pathp, int *fdp)
+parse_args(char* argv[], int argc, bool *use_pathp, int *fdp,
+ const char **argv0)
{
const char *arg;
- int fd, i, j, arglen;
+ char machine[64];
+ size_t sz;
+ int arglen, fd, i, j, mib[2];
char opt;
+ bool seen_b, seen_f;
dbg("Parsing command-line arguments");
*use_pathp = false;
*fdp = -1;
+ seen_b = seen_f = false;
for (i = 1; i < argc; i++ ) {
arg = argv[i];
@@ -5598,7 +5603,21 @@ parse_args(char* argv[], int argc, bool *use_pathp, in
if (opt == 'h') {
print_usage(argv[0]);
_exit(0);
+ } else if (opt == 'b') {
+ if (seen_f) {
+ _rtld_error("Both -b and -f specified");
+ rtld_die();
+ }
+ i++;
+ *argv0 = argv[i];
+ seen_b = true;
+ break;
} else if (opt == 'f') {
+ if (seen_b) {
+ _rtld_error("Both -b and -f specified");
+ rtld_die();
+ }
+
/*
* -f XX can be used to specify a
* descriptor for the binary named at
@@ -5622,9 +5641,28 @@ parse_args(char* argv[], int argc, bool *use_pathp, in
rtld_die();
}
*fdp = fd;
+ seen_f = true;
break;
} else if (opt == 'p') {
*use_pathp = true;
+ } else if (opt == 'v') {
+ machine[0] = '\0';
+ mib[0] = CTL_HW;
+ mib[1] = HW_MACHINE;
+ sz = sizeof(machine);
+ sysctl(mib, nitems(mib), machine, &sz, NULL, 0);
+ rtld_printf(
+ "FreeBSD ld-elf.so.1 %s\n"
+ "FreeBSD_version %d\n"
+ "Default lib path %s\n"
+ "Env prefix %s\n"
+ "Hint file %s\n"
+ "libmap file %s\n",
+ machine,
+ __FreeBSD_version, ld_standard_library_path,
+ ld_env_prefix, ld_elf_hints_default,
+ ld_path_libmap_conf);
+ _exit(0);
} else {
_rtld_error("Invalid argument: '%s'", arg);
print_usage(argv[0]);
@@ -5633,6 +5671,8 @@ parse_args(char* argv[], int argc, bool *use_pathp, in
}
}
+ if (!seen_b)
+ *argv0 = argv[i];
return (i);
}
@@ -5667,15 +5707,18 @@ static void
print_usage(const char *argv0)
{
- rtld_printf("Usage: %s [-h] [-f <FD>] [--] <binary> [<args>]\n"
- "\n"
- "Options:\n"
- " -h Display this help message\n"
- " -p Search in PATH for named binary\n"
- " -f <FD> Execute <FD> instead of searching for <binary>\n"
- " -- End of RTLD options\n"
- " <binary> Name of process to execute\n"
- " <args> Arguments to the executed process\n", argv0);
+ rtld_printf(
+ "Usage: %s [-h] [-b <exe>] [-f <FD>] [-p] [--] <binary> [<args>]\n"
+ "\n"
+ "Options:\n"
+ " -h Display this help message\n"
+ " -b <exe> Execute <exe> instead of <binary>, arg0 is <binary>\n"
+ " -f <FD> Execute <FD> instead of searching for <binary>\n"
+ " -p Search in PATH for named binary\n"
+ " -v Display identification information\n"
+ " -- End of RTLD options\n"
+ " <binary> Name of process to execute\n"
+ " <args> Arguments to the executed process\n", argv0);
}
/*
More information about the svn-src-stable-12
mailing list