mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 04:43:53 +00:00
ldd: do not use dlopen(RTLD_TRACE) for dso when format is specified
Problem is that rtld cannot reliably access updated environment.
This was made more obvious by bfd4c875a1
. The application
environment can be in arbitrary state and place, system components
can observe it only during execve(2), or in case of rtld, right after
execve, when environment is still at know location and format.
Instead spawn ld-elf.so.1 in direct exec mode which can correctly read
all inherited updates to the environment.
PR: 259069
Reviewed by: arichardson, jhb
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D32464
This commit is contained in:
parent
ca8c576d10
commit
2c7a6dad4d
|
@ -3,6 +3,7 @@
|
|||
PROG?= ldd
|
||||
SRCS= ldd.c
|
||||
|
||||
CFLAGS+= -I${SRCTOP}/libexec/rtld-elf
|
||||
LIBADD= elf
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
|
|
@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
|
|||
#include <fcntl.h>
|
||||
#include <gelf.h>
|
||||
#include <libelf.h>
|
||||
#include <rtld_paths.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -134,6 +135,7 @@ int
|
|||
main(int argc, char *argv[])
|
||||
{
|
||||
char *fmt1, *fmt2;
|
||||
const char *rtld;
|
||||
int aflag, c, fd, rval, status, is_shlib, rv, type;
|
||||
|
||||
aflag = 0;
|
||||
|
@ -234,9 +236,17 @@ main(int argc, char *argv[])
|
|||
if (is_shlib == 0) {
|
||||
execl(*argv, *argv, (char *)NULL);
|
||||
warn("%s", *argv);
|
||||
} else {
|
||||
} else if (fmt1 == NULL && fmt2 == NULL) {
|
||||
dlopen(*argv, RTLD_TRACE);
|
||||
warnx("%s: %s", *argv, dlerror());
|
||||
} else {
|
||||
rtld = _PATH_RTLD;
|
||||
#if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED)
|
||||
if (type == TYPE_ELF32)
|
||||
rtld = _COMPAT32_PATH_RTLD;
|
||||
#endif
|
||||
execl(rtld, rtld, "-d", "--",
|
||||
*argv, (char *)NULL);
|
||||
}
|
||||
_exit(1);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue