summaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2020-06-16 21:29:02 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2020-06-16 21:29:02 +0000
commit512baba6a5c060c8a0eca291e0d0a379c1e784f9 (patch)
tree9931d5298dea4080198910b465d171a3ecae3abf /libexec
parent53b1c3203595579bd2f6c6fb0eea9551c7d7c8f4 (diff)
downloadsrc-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.c7
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);