From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.3 required=5.0 tests=MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 19016 invoked from network); 6 Jun 2022 06:16:52 -0000 Received: from mother.openwall.net (195.42.179.200) by inbox.vuxu.org with ESMTPUTF8; 6 Jun 2022 06:16:52 -0000 Received: (qmail 5813 invoked by uid 550); 6 Jun 2022 06:16:49 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 5781 invoked from network); 6 Jun 2022 06:16:49 -0000 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=aVSZodZ3jTAwNfexhoNltFXp368YilrueQkSY4N7u4w=; b=MNas/hZrUvmznGSmGGRjEUMuxXigEDXOZ8Wjxf7ihVh7kBJTZwyO97QZREeBKukfq0 FLNQ0IxiGZgxi8sANnAZCyAFdLfE19g3WgmS0DxzB9P8YiY3Sko4z847XqdB5pIMVvwh VioWvmCnXhc9GuYnG+yEYJEt7tw+pC5MYjj5t5AtI6M4j7LTmEHNOTkO2jqEzqx6xJ0h bF1ja294aTEYsMBkQwF3ZrmTUWZ76/SuETWogM2ILrOMqIZXJdeFWH6wCk1eLkXpGM9r BZgk9A6WWpr4nfsxCeECQTMYmTCT+PmofQntSkEnz/9hq6Nqczozfy25vHI66bJmE5fy D9eg== X-Gm-Message-State: AOAM531bJ54vhLGJt0fRIg9HXJDqUPPq5OWMYe/TCSMCsT6b5v7iDiWs T/CfK7fJ0sfnBTgD/yfIjOdeCtvre4k= X-Google-Smtp-Source: ABdhPJwXgbJs3NvmUfYuUoBrX0UOVmUmh8cqLIqXuKpRI0t4md9MhD/82/er2pvZFQqx7qAVP8IKbg== X-Received: by 2002:a17:902:ef47:b0:156:646b:58e7 with SMTP id e7-20020a170902ef4700b00156646b58e7mr22398017plx.57.1654496196948; Sun, 05 Jun 2022 23:16:36 -0700 (PDT) From: Fangrui Song To: musl@lists.openwall.com Cc: Fangrui Song Date: Sun, 5 Jun 2022 23:16:33 -0700 Message-Id: <20220606061633.539208-1-i@maskray.me> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [musl] [PATCH] ldso: support DT_RELR relative relocation format this resolves DT_RELR relocations in non-ldso objects. generic-abi pre-standard for DT_RELR: https://groups.google.com/g/generic-abi/c/bX460iggiKg FreeBSD rtld added DT_RELR support in 2021-08. glibc added DT_RELR support in 2022-04. Since ld.lld 7, --pack-dyn-relocs=relr can generate DT_RELR. Since binutils 2.38, GNU ld's x86 and powerpc64 ports supports -z pack-relative-relocs to generate DT_RELR. ld.lld 15 also has the option. --- Changes from https://www.openwall.com/lists/musl/2019/03/06/3 * rename some variables * decode_vec: add `if (v[0] < 8*sizeof(long))` --- include/elf.h | 8 ++++++-- ldso/dynlink.c | 20 +++++++++++++++++++- src/internal/dynlink.h | 2 +- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/include/elf.h b/include/elf.h index 86e2f0bb..9e980a29 100644 --- a/include/elf.h +++ b/include/elf.h @@ -385,7 +385,8 @@ typedef struct { #define SHT_PREINIT_ARRAY 16 #define SHT_GROUP 17 #define SHT_SYMTAB_SHNDX 18 -#define SHT_NUM 19 +#define SHT_RELR 19 +#define SHT_NUM 20 #define SHT_LOOS 0x60000000 #define SHT_GNU_ATTRIBUTES 0x6ffffff5 #define SHT_GNU_HASH 0x6ffffff6 @@ -754,7 +755,10 @@ typedef struct { #define DT_PREINIT_ARRAY 32 #define DT_PREINIT_ARRAYSZ 33 #define DT_SYMTAB_SHNDX 34 -#define DT_NUM 35 +#define DT_RELRSZ 35 +#define DT_RELR 36 +#define DT_RELRENT 37 +#define DT_NUM 38 #define DT_LOOS 0x6000000d #define DT_HIOS 0x6ffff000 #define DT_LOPROC 0x70000000 diff --git a/ldso/dynlink.c b/ldso/dynlink.c index 5b9c8be4..a50ef00a 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -208,7 +208,8 @@ static void decode_vec(size_t *v, size_t *a, size_t cnt) size_t i; for (i=0; ibase; + size_t *reloc_addr; + for (; relr_size; relr++, relr_size-=sizeof(size_t)) + if ((relr[0]&1) == 0) { + reloc_addr = laddr(dso, relr[0]); + *reloc_addr++ += (size_t)base; + } else { + int i = 0; + for (size_t bitmap=relr[0]; (bitmap>>=1); i++) + if (bitmap&1) + reloc_addr[i] += (size_t)base; + reloc_addr += 8*sizeof(size_t)-1; + } +} + static void redo_lazy_relocs() { struct dso *p = lazy_head, *next; @@ -1355,6 +1372,7 @@ static void reloc_all(struct dso *p) 2+(dyn[DT_PLTREL]==DT_RELA)); do_relocs(p, laddr(p, dyn[DT_REL]), dyn[DT_RELSZ], 2); do_relocs(p, laddr(p, dyn[DT_RELA]), dyn[DT_RELASZ], 3); + do_relr_relocs(p, laddr(p, dyn[DT_RELR]), dyn[DT_RELRSZ]); if (head != &ldso && p->relro_start != p->relro_end && mprotect(laddr(p, p->relro_start), p->relro_end-p->relro_start, PROT_READ) diff --git a/src/internal/dynlink.h b/src/internal/dynlink.h index 51c0639f..830354eb 100644 --- a/src/internal/dynlink.h +++ b/src/internal/dynlink.h @@ -93,7 +93,7 @@ struct fdpic_dummy_loadmap { #endif #define AUX_CNT 32 -#define DYN_CNT 32 +#define DYN_CNT 37 typedef void (*stage2_func)(unsigned char *, size_t *); -- 2.36.1