diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2020-06-16 21:29:02 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2020-06-16 21:29:02 +0000 |
commit | 512baba6a5c060c8a0eca291e0d0a379c1e784f9 (patch) | |
tree | 9931d5298dea4080198910b465d171a3ecae3abf /libexec | |
parent | 53b1c3203595579bd2f6c6fb0eea9551c7d7c8f4 (diff) | |
download | src-test2-512baba6a5c060c8a0eca291e0d0a379c1e784f9.tar.gz src-test2-512baba6a5c060c8a0eca291e0d0a379c1e784f9.zip |
rtld: Allow to load ET_DYN && DF_1_PIE when tracing.
This makes old ldd to still work on newer tagged PIE binaries.
Also move debug line for hashes before both decisions to not load are
done, so that the end of digest_dynamic() processing and reason to not
load or load is seen in debug trace.
Noted by: jhb
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=362251
Diffstat (limited to 'libexec')
-rw-r--r-- | libexec/rtld-elf/rtld.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index c6aa795bdb07..4f24e0564a54 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -2612,12 +2612,13 @@ do_load_object(int fd, const char *name, char *path, struct stat *sbp, obj->path = path; if (!digest_dynamic(obj, 0)) goto errp; - if (obj->z_pie) { + dbg("%s valid_hash_sysv %d valid_hash_gnu %d dynsymcount %d", obj->path, + obj->valid_hash_sysv, obj->valid_hash_gnu, obj->dynsymcount); + if (obj->z_pie && (flags & RTLD_LO_TRACE) == 0) { + dbg("refusing to load PIE executable \"%s\"", obj->path); _rtld_error("Cannot load PIE binary %s as DSO", obj->path); goto errp; } - dbg("%s valid_hash_sysv %d valid_hash_gnu %d dynsymcount %d", obj->path, - obj->valid_hash_sysv, obj->valid_hash_gnu, obj->dynsymcount); if (obj->z_noopen && (flags & (RTLD_LO_DLOPEN | RTLD_LO_TRACE)) == RTLD_LO_DLOPEN) { dbg("refusing to load non-loadable \"%s\"", obj->path); |