Received: by 2002:ac0:8c9a:0:0:0:0:0 with SMTP id r26csp5665217ima; Tue, 5 Feb 2019 16:14:46 -0800 (PST) X-Google-Smtp-Source: AHgI3IYgHnm8AxvCrFaVb3K43/f3fpx7g0G5qQrayikEEUxLMjCxW2r7kXdWjpdz2r2jWu/bCSdm X-Received: by 2002:a62:4e16:: with SMTP id c22mr7566660pfb.167.1549412086453; Tue, 05 Feb 2019 16:14:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549412086; cv=none; d=google.com; s=arc-20160816; b=dINJAYrQTvhM4tXvmOywT8xbj700/LZIKHGfBjBFk5mncTTFwN2bllIryf91HyAt2+ JiX8p6vAr7F4IIsYGg/KU/oVmWV5jwaK2NaBtEDkH4pASxmZvkVGe1cD6gRuV0VkU30O EYE7TANcqtzsv2yomBx5Re3e8a0GQBn97nrBLhUen1+jryiKg7gN8Ki0cZaOcsMaZ0Kw gjLPhkLzJ75OYO01vJHpbjHn2ElPKZwELgwWX9FsKCwwSVGLxTsVoxp4XusB4AyLfjbH IcU5ErFhPLofbeh7n/b6PCWzGBdxlBr+YhEQ1G5G2NfpMIm5RhExTGl7tcxrSP+nE9jE SYCg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=kiW8u5Nz8oz6X6T0UBPC6luCzcvn2LEP6I2yT9EsYr8=; b=CHVyVW9oU7eHaMD7iRgBxyArfvobAYq6RmpKFT6fVjZj/40RrqOskbZOlHZeRV3dmB UDxx85eUGT8INrIxHHJLGyDitQFnxaH38eKZFUEuvdm/PmBuA4RGL7GLX+LMqgO03/dX K+ySqqvTek1UWrCGbUFv3KumF/3TfGX4W02tm3XsEgbJR3t8zCvhnMUNvaUEhZzrkHb3 zU5TFMkkKVWPtqWInMMUmoyTVzbCUUcHBciQg47y4A/kIiDooU3gYjO4nmCS+sAbY2nc j8RqL7IR9peGm12Okz9bm5j5O+4TQtiWBwHgGAHf60JaX37kBXx4ASx9VsetPTlpb7tU FIew== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@arista.com header.s=googlenew header.b=bfbf+3n9; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=REJECT dis=NONE) header.from=arista.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s4si4317122pgm.562.2019.02.05.16.14.31; Tue, 05 Feb 2019 16:14:46 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@arista.com header.s=googlenew header.b=bfbf+3n9; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=REJECT dis=NONE) header.from=arista.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728998AbfBFANM (ORCPT + 99 others); Tue, 5 Feb 2019 19:13:12 -0500 Received: from mail-ed1-f67.google.com ([209.85.208.67]:46169 "EHLO mail-ed1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728652AbfBFALc (ORCPT ); Tue, 5 Feb 2019 19:11:32 -0500 Received: by mail-ed1-f67.google.com with SMTP id o10so4432435edt.13 for ; Tue, 05 Feb 2019 16:11:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arista.com; s=googlenew; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kiW8u5Nz8oz6X6T0UBPC6luCzcvn2LEP6I2yT9EsYr8=; b=bfbf+3n9b/IlhtShm86KPqAPB6hQT4bOgMz2k7uWLsTzHXoTdKHPXhSVEvNupdMIio oDJiZKkWo9pITLRIyoKFec4E1BxfHr/ACOWt5zUPeWXYaLW+2wY0MJhfQmJvy7wMNi4R n7RdCAk+wRxjDC01zMzkumC2ki+pel2Q1XDc84uNetJPq6jFFUY0c2pzNRfyzUUc31QF Zzn8YqW2s7qqYbcLNlozh0dMPB8yJ0r8pcLf5BwyiyvH6nJ7koTyAlfJUQK4hE+8DCCM 1JWRcWeywy2g70bcfM1gUg27nAtvobcIEK4cHQ3LjEqD13/1JFtfqM8wYaR+u59J0AGp WMAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kiW8u5Nz8oz6X6T0UBPC6luCzcvn2LEP6I2yT9EsYr8=; b=ZBNYQOMFrOvorZF3J8rLMinCpFJCXqt4zqcQMahUlD+XrVnIrGO+0+ald99+XdsqJp YSymoX8AghTCm4S/qZQN1ncqxufmIorVMUU5UOUzsGD95ruWb9hMyQH2yS3O8XVN30IR 2b10NBgNdWfff1VeFVTVOOC8BIcHHddL5k/4Z37UcC17UyVuQVn0eWhpasGnO4ON+jao 3R93/BZ3KG5AagHNQ+ivjZqOS4OUI/DcLgVYjLnQmXZVaWhc9IrHKhTVdb+K/gGkVw1c sClnsgJbcPLMPwiedZM/fQ295Rh+hgWd1g+fQZp+m0LdyYnKxWV0Wnv+Ub07MYYrer94 9hbA== X-Gm-Message-State: AHQUAuYXHE1P3Vx2NahbN22mYXvZNUnmWA8Qfhh+U5bY288vdwR0mViq QuJMP/quFK6PXfRLc892STs4Bq/hbnQ= X-Received: by 2002:a50:a3d4:: with SMTP id t20mr6041122edb.159.1549411889843; Tue, 05 Feb 2019 16:11:29 -0800 (PST) Received: from Mindolluin.ire.aristanetworks.com ([217.173.96.166]) by smtp.gmail.com with ESMTPSA id p30sm5489594eda.68.2019.02.05.16.11.28 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Tue, 05 Feb 2019 16:11:29 -0800 (PST) From: Dmitry Safonov To: linux-kernel@vger.kernel.org Cc: Dmitry Safonov , Adrian Reber , Andrei Vagin , Andrei Vagin , Andy Lutomirski , Andy Tucker , Arnd Bergmann , Christian Brauner , Cyrill Gorcunov , Dmitry Safonov <0x7f454c46@gmail.com>, "Eric W. Biederman" , "H. Peter Anvin" , Ingo Molnar , Jeff Dike , Oleg Nesterov , Pavel Emelyanov , Shuah Khan , Thomas Gleixner , containers@lists.linux-foundation.org, criu@openvz.org, linux-api@vger.kernel.org, x86@kernel.org Subject: [PATCH 15/32] x86/vdso2c: Optionally produce linker script for vdso entries Date: Wed, 6 Feb 2019 00:10:49 +0000 Message-Id: <20190206001107.16488-16-dima@arista.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190206001107.16488-1-dima@arista.com> References: <20190206001107.16488-1-dima@arista.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Two VDSO images (with/without code for adding offsets inside timens) should be compatible by VDSO function offsets - this way kernel can remap VDSO VMA for a task without fixupping GOT/PLT. Add an optional parameter for vdso2c to generate .entries file from vdso.so. As timens VDSO by nature is bigger in .text than VDSO for tasks outside namespace, this parameter will be used to generate .entries file from timens VDSO and include those aligns into linker script for !timens VDSO building. Signed-off-by: Dmitry Safonov --- arch/x86/entry/vdso/.gitignore | 1 + arch/x86/entry/vdso/Makefile | 7 ++++--- arch/x86/entry/vdso/vdso2c.c | 26 +++++++++++++++++++------- arch/x86/entry/vdso/vdso2c.h | 16 +++++++++++++++- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/arch/x86/entry/vdso/.gitignore b/arch/x86/entry/vdso/.gitignore index aae8ffdd5880..9ab4fa4c7e7b 100644 --- a/arch/x86/entry/vdso/.gitignore +++ b/arch/x86/entry/vdso/.gitignore @@ -5,3 +5,4 @@ vdso32-sysenter-syms.lds vdso32-int80-syms.lds vdso-image-*.c vdso2c +vdso*.entries diff --git a/arch/x86/entry/vdso/Makefile b/arch/x86/entry/vdso/Makefile index 55ba81d4415c..ccb572831ea1 100644 --- a/arch/x86/entry/vdso/Makefile +++ b/arch/x86/entry/vdso/Makefile @@ -47,8 +47,8 @@ vobjs32-timens := $(foreach F,$(vobjs32-timens-y),$(obj)/$F) $(obj)/vdso.o: $(obj)/vdso.so -targets += vdso.lds $(vobjs-y) $(vobjs-timens-y) -targets += vdso32/vdso32.lds $(vobjs32-y) $(vobjs32-timens-y) +targets += vdso.lds $(vobjs-y) $(vobjs-timens-y) vdso64.entries +targets += vdso32/vdso32.lds $(vobjs32-y) $(vobjs32-timens-y) vdso32.entries # Build the vDSO image C files and link them in. vdso_img_objs := $(vdso_img-y:%=vdso-image-%.o) @@ -73,7 +73,8 @@ HOST_EXTRACFLAGS += -I$(srctree)/tools/include -I$(srctree)/include/uapi -I$(src hostprogs-y += vdso2c quiet_cmd_vdso2c = VDSO2C $@ - cmd_vdso2c = $(obj)/vdso2c $< $(<:%.dbg=%) $@ + cmd_vdso2c = $(obj)/vdso2c $< $(<:%.dbg=%) $@ \ + $(filter %.entries,$(<:%-timens.so.dbg=%.entries)) $(obj)/vdso-image-%.c: $(obj)/vdso%.so.dbg $(obj)/vdso%.so $(obj)/vdso2c FORCE $(call if_changed,vdso2c) diff --git a/arch/x86/entry/vdso/vdso2c.c b/arch/x86/entry/vdso/vdso2c.c index ed66b023d4b9..72731c4cfdce 100644 --- a/arch/x86/entry/vdso/vdso2c.c +++ b/arch/x86/entry/vdso/vdso2c.c @@ -152,6 +152,7 @@ extern void bad_put_le(void); #define BITSFUNC3(name, bits, suffix) name##bits##suffix #define BITSFUNC2(name, bits, suffix) BITSFUNC3(name, bits, suffix) #define BITSFUNC(name) BITSFUNC2(name, ELF_BITS, ) +#define ELF_FUNC(f, x) (BITSFUNC2(ELF, ELF_BITS, _##f)(x)) #define INT_BITS BITSFUNC2(int, ELF_BITS, _t) @@ -169,16 +170,17 @@ extern void bad_put_le(void); static void go(void *raw_addr, size_t raw_len, void *stripped_addr, size_t stripped_len, - FILE *outfile, const char *name) + FILE *outfile, const char *name, + FILE *out_entries_lds) { Elf64_Ehdr *hdr = (Elf64_Ehdr *)raw_addr; if (hdr->e_ident[EI_CLASS] == ELFCLASS64) { go64(raw_addr, raw_len, stripped_addr, stripped_len, - outfile, name); + outfile, name, out_entries_lds); } else if (hdr->e_ident[EI_CLASS] == ELFCLASS32) { go32(raw_addr, raw_len, stripped_addr, stripped_len, - outfile, name); + outfile, name, out_entries_lds); } else { fail("unknown ELF class\n"); } @@ -208,12 +210,12 @@ int main(int argc, char **argv) { size_t raw_len, stripped_len; void *raw_addr, *stripped_addr; - FILE *outfile; + FILE *outfile, *entries_lds = NULL; char *name, *tmp; int namelen; - if (argc != 4) { - printf("Usage: vdso2c RAW_INPUT STRIPPED_INPUT OUTPUT\n"); + if (argc < 4) { + printf("Usage: vdso2c RAW_INPUT STRIPPED_INPUT OUTPUT [OUTPUT_ENTRIES.LDS]\n"); return 1; } @@ -245,11 +247,21 @@ int main(int argc, char **argv) if (!outfile) err(1, "fopen(%s)", outfilename); - go(raw_addr, raw_len, stripped_addr, stripped_len, outfile, name); + if (argc == 5) { + entries_lds = fopen(argv[4], "w"); + if (!entries_lds) { + fclose(outfile); + err(1, "fopen(%s)", argv[4]); + } + } + + go(raw_addr, raw_len, stripped_addr, stripped_len, outfile, name, entries_lds); munmap(raw_addr, raw_len); munmap(stripped_addr, stripped_len); fclose(outfile); + if (entries_lds) + fclose(entries_lds); return 0; } diff --git a/arch/x86/entry/vdso/vdso2c.h b/arch/x86/entry/vdso/vdso2c.h index 61c8bb2e5af8..065dac6c29c8 100644 --- a/arch/x86/entry/vdso/vdso2c.h +++ b/arch/x86/entry/vdso/vdso2c.h @@ -7,7 +7,8 @@ static void BITSFUNC(go)(void *raw_addr, size_t raw_len, void *stripped_addr, size_t stripped_len, - FILE *outfile, const char *name) + FILE *outfile, const char *name, + FILE *out_entries_lds) { int found_load = 0; unsigned long load_size = -1; /* Work around bogus warning */ @@ -111,6 +112,19 @@ static void BITSFUNC(go)(void *raw_addr, size_t raw_len, syms[k] = GET_LE(&sym->st_value); } } + + if (!out_entries_lds) + continue; + + if (ELF_FUNC(ST_BIND, sym->st_info) != STB_GLOBAL) + continue; + + if (ELF_FUNC(ST_TYPE, sym->st_info) != STT_FUNC) + continue; + + fprintf(out_entries_lds, "\t\t. = ABSOLUTE(%#lx);\n", + (unsigned long)GET_LE(&sym->st_value)); + fprintf(out_entries_lds, "\t\t*(.text.%s*)\n", name); } /* Validate mapping addresses. */ -- 2.20.1