rtld: populate DT_DEBUG iff DYNAMIC segment is writable
MIPS has/had a read-only DYNAMIC segment, and uses an extra level of indirection (through MIPS_RLD_MAP) to locate the debugger rendezvous data. Some linkers (e.g. LLVM's lld) may produce MIPS binaries with a writable DYNAMIC segment, which would allow us to eventually drop a special case. Therefore, instead of hardcoding knowledge that DYNAMIC is not writable on MIPS just check the permissions on the segment. Reviewed by: kib MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D4791
This commit is contained in:
parent
1041e09089
commit
7a2ff73d68
@ -1144,13 +1144,13 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
|
||||
* is mapped read-only. DT_MIPS_RLD_MAP is used instead.
|
||||
*/
|
||||
|
||||
#ifndef __mips__
|
||||
case DT_DEBUG:
|
||||
if (!obj->writable_dynamic)
|
||||
break;
|
||||
if (!early)
|
||||
dbg("Filling in DT_DEBUG entry");
|
||||
((Elf_Dyn*)dynp)->d_un.d_ptr = (Elf_Addr) &r_debug;
|
||||
break;
|
||||
#endif
|
||||
|
||||
case DT_FLAGS:
|
||||
if (dynp->d_un.d_val & DF_ORIGIN)
|
||||
@ -1331,6 +1331,8 @@ digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry, const char *path)
|
||||
break;
|
||||
|
||||
case PT_DYNAMIC:
|
||||
if (ph->p_flags & PROT_WRITE)
|
||||
obj->writable_dynamic = true;
|
||||
obj->dynamic = (const Elf_Dyn *)(ph->p_vaddr + obj->relocbase);
|
||||
break;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user