diff options
author | Philip Guenther <guenther@cvs.openbsd.org> | 2019-12-07 22:57:49 +0000 |
---|---|---|
committer | Philip Guenther <guenther@cvs.openbsd.org> | 2019-12-07 22:57:49 +0000 |
commit | 69435a08336c1e465df0a7e105e263777a3c9d5a (patch) | |
tree | 8692ed3789dab69c3fcf2b40f2a1d28e981df77f | |
parent | 931d1c94dd72f93bfbdef370008c9ef3ece61b0b (diff) |
Disable ltrace for objects linked with -znow, as at least on amd64, linking
that was deletes the lazy relocation trampoline which ltrace currently
depends on
problem reported by tb@
directional feedback kettenis@
ok mpi@
-rw-r--r-- | libexec/ld.so/aarch64/rtld_machine.c | 5 | ||||
-rw-r--r-- | libexec/ld.so/alpha/rtld_machine.c | 5 | ||||
-rw-r--r-- | libexec/ld.so/amd64/rtld_machine.c | 5 | ||||
-rw-r--r-- | libexec/ld.so/arm/rtld_machine.c | 5 | ||||
-rw-r--r-- | libexec/ld.so/hppa/rtld_machine.c | 5 | ||||
-rw-r--r-- | libexec/ld.so/i386/rtld_machine.c | 5 | ||||
-rw-r--r-- | libexec/ld.so/loader.c | 16 | ||||
-rw-r--r-- | libexec/ld.so/m88k/rtld_machine.c | 5 | ||||
-rw-r--r-- | libexec/ld.so/mips64/rtld_machine.c | 5 | ||||
-rw-r--r-- | libexec/ld.so/powerpc/rtld_machine.c | 5 | ||||
-rw-r--r-- | libexec/ld.so/sh/rtld_machine.c | 5 | ||||
-rw-r--r-- | libexec/ld.so/sparc64/rtld_machine.c | 5 |
12 files changed, 24 insertions, 47 deletions
diff --git a/libexec/ld.so/aarch64/rtld_machine.c b/libexec/ld.so/aarch64/rtld_machine.c index 5516364570a..5ac50d715cf 100644 --- a/libexec/ld.so/aarch64/rtld_machine.c +++ b/libexec/ld.so/aarch64/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.17 2019/11/28 16:54:29 guenther Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.18 2019/12/07 22:57:47 guenther Exp $ */ /* * Copyright (c) 2004 Dale Rahn @@ -242,9 +242,6 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) if (object->Dyn.info[DT_PLTREL] != DT_RELA) return 0; - if (object->traced) - lazy = 1; - if (!lazy) { fails = _dl_md_reloc(object, DT_JMPREL, DT_PLTRELSZ); } else { diff --git a/libexec/ld.so/alpha/rtld_machine.c b/libexec/ld.so/alpha/rtld_machine.c index 0e4c93f6bc7..24029fcad4e 100644 --- a/libexec/ld.so/alpha/rtld_machine.c +++ b/libexec/ld.so/alpha/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.69 2019/10/23 19:55:08 guenther Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.70 2019/12/07 22:57:47 guenther Exp $ */ /* * Copyright (c) 1999 Dale Rahn @@ -238,9 +238,6 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) pltgot = (Elf_Addr *)object->Dyn.info[DT_PLTGOT]; - if (object->traced) - lazy = 1; - if (!lazy || pltgot == NULL) { fails = _dl_md_reloc(object, DT_JMPREL, DT_PLTRELSZ); } else { diff --git a/libexec/ld.so/amd64/rtld_machine.c b/libexec/ld.so/amd64/rtld_machine.c index 16d13e349f1..e36b29d2f6b 100644 --- a/libexec/ld.so/amd64/rtld_machine.c +++ b/libexec/ld.so/amd64/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.38 2019/11/28 16:54:29 guenther Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.39 2019/12/07 22:57:47 guenther Exp $ */ /* * Copyright (c) 2002,2004 Dale Rahn @@ -368,9 +368,6 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) if (object->Dyn.info[DT_PLTREL] != DT_RELA) return 0; - if (object->traced) - lazy = 1; - if (__predict_false(!lazy)) { fails = _dl_md_reloc(object, DT_JMPREL, DT_PLTRELSZ); } else { diff --git a/libexec/ld.so/arm/rtld_machine.c b/libexec/ld.so/arm/rtld_machine.c index e4933e53065..a7c9778a9cf 100644 --- a/libexec/ld.so/arm/rtld_machine.c +++ b/libexec/ld.so/arm/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.38 2019/11/28 16:54:30 guenther Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.39 2019/12/07 22:57:47 guenther Exp $ */ /* * Copyright (c) 2004 Dale Rahn @@ -305,9 +305,6 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) if (object->Dyn.info[DT_PLTREL] != DT_REL) return 0; - if (object->traced) - lazy = 1; - if (!lazy) { fails = _dl_md_reloc(object, DT_JMPREL, DT_PLTRELSZ); } else { diff --git a/libexec/ld.so/hppa/rtld_machine.c b/libexec/ld.so/hppa/rtld_machine.c index 7e4645f10a8..89dd9628370 100644 --- a/libexec/ld.so/hppa/rtld_machine.c +++ b/libexec/ld.so/hppa/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.41 2019/10/23 19:55:09 guenther Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.42 2019/12/07 22:57:47 guenther Exp $ */ /* * Copyright (c) 2004 Michael Shalayeff @@ -312,9 +312,6 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) if (object->dyn.pltrel != DT_RELA) return 0; - if (object->traced) - lazy = 1; - if (!lazy) { fails = _dl_md_reloc(object, DT_JMPREL, DT_PLTRELSZ); } else { diff --git a/libexec/ld.so/i386/rtld_machine.c b/libexec/ld.so/i386/rtld_machine.c index 6ab0616e112..a23a188f3f4 100644 --- a/libexec/ld.so/i386/rtld_machine.c +++ b/libexec/ld.so/i386/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.47 2019/11/28 16:54:30 guenther Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.48 2019/12/07 22:57:48 guenther Exp $ */ /* * Copyright (c) 2002 Dale Rahn @@ -369,9 +369,6 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) if (object->Dyn.info[DT_PLTREL] != DT_REL) return 0; - if (object->traced) - lazy = 1; - if (!lazy) { fails = _dl_md_reloc(object, DT_JMPREL, DT_PLTRELSZ); } else { diff --git a/libexec/ld.so/loader.c b/libexec/ld.so/loader.c index 3ffe9307c3f..7ed24131350 100644 --- a/libexec/ld.so/loader.c +++ b/libexec/ld.so/loader.c @@ -1,4 +1,4 @@ -/* $OpenBSD: loader.c,v 1.187 2019/10/04 17:42:16 guenther Exp $ */ +/* $OpenBSD: loader.c,v 1.188 2019/12/07 22:57:47 guenther Exp $ */ /* * Copyright (c) 1998 Per Fogelstrom, Opsycon AB @@ -718,8 +718,18 @@ _dl_rtld(elf_object_t *object) fails =_dl_md_reloc(object, DT_REL, DT_RELSZ); fails += _dl_md_reloc(object, DT_RELA, DT_RELASZ); reprotect_if_textrel(object); - fails += _dl_md_reloc_got(object, !(_dl_bindnow || - object->obj_flags & DF_1_NOW)); + + /* + * We do lazy resolution by default, doing eager resolution if + * - the object requests it with -znow, OR + * - LD_BIND_NOW is set and this object isn't being ltraced + * + * Note that -znow disables ltrace for the object: on at least + * amd64 'ld' doesn't generate the trampoline for lazy relocation + * when -znow is used. + */ + fails += _dl_md_reloc_got(object, !(object->obj_flags & DF_1_NOW) && + !(_dl_bindnow && !object->traced)); /* * Look for W&X segments and make them read-only. diff --git a/libexec/ld.so/m88k/rtld_machine.c b/libexec/ld.so/m88k/rtld_machine.c index 9635e5b5b67..59a13f367f5 100644 --- a/libexec/ld.so/m88k/rtld_machine.c +++ b/libexec/ld.so/m88k/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.28 2019/10/23 19:55:09 guenther Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.29 2019/12/07 22:57:48 guenther Exp $ */ /* * Copyright (c) 2013 Miodrag Vallat. @@ -251,9 +251,6 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) if (object->Dyn.info[DT_PLTREL] != DT_RELA) return 0; - if (object->traced) - lazy = 1; - if (!lazy) { fails = _dl_md_reloc(object, DT_JMPREL, DT_PLTRELSZ); } else { diff --git a/libexec/ld.so/mips64/rtld_machine.c b/libexec/ld.so/mips64/rtld_machine.c index a93db355625..17d29d8a13d 100644 --- a/libexec/ld.so/mips64/rtld_machine.c +++ b/libexec/ld.so/mips64/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.32 2019/10/23 19:55:09 guenther Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.33 2019/12/07 22:57:48 guenther Exp $ */ /* * Copyright (c) 1998-2004 Opsycon AB, Sweden. @@ -187,9 +187,6 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) n = object->Dyn.info[DT_MIPS_SYMTABNO - DT_LOPROC + DT_NUM] - object->Dyn.info[DT_MIPS_GOTSYM - DT_LOPROC + DT_NUM]; - if (object->traced) - lazy = 1; - /* * Then do all global references according to the ABI. * Quickstart is not yet implemented. diff --git a/libexec/ld.so/powerpc/rtld_machine.c b/libexec/ld.so/powerpc/rtld_machine.c index b1f3dc9ab38..3bc6cd2ed2b 100644 --- a/libexec/ld.so/powerpc/rtld_machine.c +++ b/libexec/ld.so/powerpc/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.69 2019/10/23 19:55:09 guenther Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.70 2019/12/07 22:57:48 guenther Exp $ */ /* * Copyright (c) 1999 Dale Rahn @@ -275,9 +275,6 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) if (object->Dyn.info[DT_PLTREL] != DT_RELA) return 0; - if (object->traced) - lazy = 1; - if (!lazy) { fails = _dl_md_reloc(object, DT_JMPREL, DT_PLTRELSZ); } else { diff --git a/libexec/ld.so/sh/rtld_machine.c b/libexec/ld.so/sh/rtld_machine.c index f2c252ac1d3..7f5c679740f 100644 --- a/libexec/ld.so/sh/rtld_machine.c +++ b/libexec/ld.so/sh/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.32 2019/10/24 22:11:10 guenther Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.33 2019/12/07 22:57:48 guenther Exp $ */ /* * Copyright (c) 2004 Dale Rahn @@ -743,9 +743,6 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) if (object->Dyn.info[DT_PLTREL] != DT_RELA) return 0; - if (object->traced) - lazy = 1; - if (!lazy) { fails = _dl_md_reloc(object, DT_JMPREL, DT_PLTRELSZ); } else { diff --git a/libexec/ld.so/sparc64/rtld_machine.c b/libexec/ld.so/sparc64/rtld_machine.c index 14ba5591406..a83a99593a8 100644 --- a/libexec/ld.so/sparc64/rtld_machine.c +++ b/libexec/ld.so/sparc64/rtld_machine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtld_machine.c,v 1.67 2019/10/23 19:55:09 guenther Exp $ */ +/* $OpenBSD: rtld_machine.c,v 1.68 2019/12/07 22:57:48 guenther Exp $ */ /* * Copyright (c) 1999 Dale Rahn @@ -811,9 +811,6 @@ _dl_md_reloc_got(elf_object_t *object, int lazy) if (object->Dyn.info[DT_PLTREL] != DT_RELA) return 0; - if (object->traced) - lazy = 1; - if (!lazy) { fails = _dl_md_reloc_all_plt(object); } else { |