From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by sourceware.org (Postfix) with ESMTPS id EA199385DC26 for ; Tue, 31 Mar 2020 17:12:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org EA199385DC26 IronPort-SDR: gkwUx6RWcjXfIBcgi1xdyfF8hv6UcpEXNPUhCHdld7z3O3dyxNn6/8bC9zuJbFn3h0POt/PUCj vj6dJRbd3NMg== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Mar 2020 10:12:27 -0700 IronPort-SDR: YaB2RdvgN7x1KmomacGYExoAOKlqMh97CjizFYc+cpOyNqZ/xRt1vrGqMzM3/IZSb7Cog5dUzg vvY/PSbZiZFw== X-IronPort-AV: E=Sophos;i="5.72,328,1580803200"; d="scan'208";a="241971309" Received: from labpc7920x-08.iul.intel.com (HELO localhost) ([172.28.49.151]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Mar 2020 10:12:27 -0700 From: Mihails Strasuns To: gdb-patches@sourceware.org Subject: [PATCH v3 6/9] [gdb/testsuite] use -Ttext-segment for jit-elf tests Date: Tue, 31 Mar 2020 19:13:53 +0200 Message-Id: <20200331171356.26126-6-mihails.strasuns@intel.com> X-Mailer: git-send-email 2.25.2 In-Reply-To: <20200331171356.26126-1-mihails.strasuns@intel.com> References: <166773> <20200331171356.26126-1-mihails.strasuns@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-25.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Mar 2020 17:12:31 -0000 Removes the need to manually relocate loaded ELF binary by using a fixed constant as both mmap base address and as a requested first segment address supplied to the linker. In future will enable JIT tests with a valid DWARF debug info. Current tests still need to compile without a debug info though, because they do a function name modification. gdb/testsuite/ChangeLog: 2020-02-18 Mihails Strasuns * lib/jit-elf-helpers.exp: supply -Ttext-segment linker flag and define LOAD_ADDRESS/LOAD_INCREMENT macros for the compiled binaries * gdb.base/jit-elf-main.c: use LOAD_ADDRESS/LOAD_INCREMENT to calculate the mmap address Change-Id: Ifdd70d2838d9235e5d4fb49b7cafd03cb4865751 Signed-off-by: Mihails Strasuns --- gdb/testsuite/gdb.base/jit-elf-main.c | 27 +++++++++++++++------------ gdb/testsuite/lib/jit-elf-helpers.exp | 20 +++++++++++++++++++- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/gdb/testsuite/gdb.base/jit-elf-main.c b/gdb/testsuite/gdb.base/jit-elf-main.c index 66c6e10f24..edf2f692f8 100644 --- a/gdb/testsuite/gdb.base/jit-elf-main.c +++ b/gdb/testsuite/gdb.base/jit-elf-main.c @@ -51,20 +51,16 @@ usage (void) exit (1); } -/* Update .p_vaddr and .sh_addr as if the code was JITted to ADDR. */ +/* Rename jit_function_XXXX to match idx */ static void -update_locations (const void *const addr, int idx) +update_name (const void *const addr, int idx) { const ElfW (Ehdr) *const ehdr = (ElfW (Ehdr) *)addr; ElfW (Shdr) *const shdr = (ElfW (Shdr) *)((char *)addr + ehdr->e_shoff); ElfW (Phdr) *const phdr = (ElfW (Phdr) *)((char *)addr + ehdr->e_phoff); int i; - for (i = 0; i < ehdr->e_phnum; ++i) - if (phdr[i].p_type == PT_LOAD) - phdr[i].p_vaddr += (ElfW (Addr))addr; - for (i = 0; i < ehdr->e_shnum; ++i) { if (shdr[i].sh_type == SHT_STRTAB) @@ -81,9 +77,6 @@ update_locations (const void *const addr, int idx) if (strcmp (p, "jit_function_XXXX") == 0) sprintf (p, "jit_function_%04d", idx); } - - if (shdr[i].sh_flags & SHF_ALLOC) - shdr[i].sh_addr += (ElfW (Addr))addr; } } @@ -96,6 +89,15 @@ update_locations (const void *const addr, int idx) #define MAIN main #endif +/* Must be defined by .exp file when compiling to know + what address to map the ELF binary to. */ +#ifndef LOAD_ADDRESS +#error "Must define LOAD_ADDRESS" +#endif +#ifndef LOAD_INCREMENT +#error "Must define LOAD_INCREMENT" +#endif + /* Used to spin waiting for GDB. */ volatile int wait_for_gdb = ATTACH; #define WAIT_FOR_GDB while (wait_for_gdb) @@ -138,8 +140,9 @@ MAIN (int argc, char *argv[]) exit (1); } - const void *const addr = mmap (0, st.st_size, PROT_READ|PROT_WRITE, - MAP_PRIVATE, fd, 0); + void* load_addr = (void*) (size_t) (LOAD_ADDRESS + (i - 1) * LOAD_INCREMENT); + const void *const addr = mmap (load_addr, st.st_size, PROT_READ|PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0); struct jit_code_entry *const entry = calloc (1, sizeof (*entry)); if (addr == MAP_FAILED) @@ -148,7 +151,7 @@ MAIN (int argc, char *argv[]) exit (1); } - update_locations (addr, i); + update_name (addr, i); /* Link entry at the end of the list. */ entry->symfile_addr = (const char *)addr; diff --git a/gdb/testsuite/lib/jit-elf-helpers.exp b/gdb/testsuite/lib/jit-elf-helpers.exp index f96dfe5ebb..4d88ea3900 100644 --- a/gdb/testsuite/lib/jit-elf-helpers.exp +++ b/gdb/testsuite/lib/jit-elf-helpers.exp @@ -13,6 +13,13 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +# Magic constants used to calculate a starting address when linking +# "jit" shared libraries. When loaded, will be mapped by jit-elf-main +# to the same address. + +set load_address 0x7000000 +set load_increment 0x1000000 + # Compiles jit-elf-main.c as a regular executable # Compile the test case program as a stand-alone binary @@ -20,11 +27,14 @@ # OPTIONS is passed to gdb_compile when compiling the program. proc compile_jit_main {binsuffix options} { global srcdir subdir + global load_address load_increment set testfile jit-elf-main set srcfile ${testfile}.c set binfile [standard_output_file $testfile$binsuffix] set options [concat \ $options \ + additional_flags=-DLOAD_ADDRESS=$load_address \ + additional_flags=-DLOAD_INCREMENT=$load_increment \ debug] if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \ executable $options] != "" } { @@ -36,11 +46,14 @@ proc compile_jit_main {binsuffix options} { # Compile the test case program as a shared library proc compile_jit_main_as_so {} { global srcdir subdir + global load_address load_increment set testfile jit-elf-main set srcfile ${testfile}.c set binfile [standard_output_file $testfile] set options [list \ additional_flags="-DMAIN=jit_dl_main" \ + additional_flags=-DLOAD_ADDRESS=$load_address \ + additional_flags=-DLOAD_INCREMENT=$load_increment \ debug] if { [gdb_compile_shlib "${srcdir}/${subdir}/${srcfile}" "${binfile}" \ $options] != "" } { @@ -54,6 +67,7 @@ proc compile_jit_main_as_so {} { # COUNT is amount of shared libraries to build proc compile_n_jit_so {count} { global srcdir subdir + global load_address load_increment set solib_binfile_targets {} set solib_testfile jit-elf-solib @@ -66,7 +80,11 @@ proc compile_n_jit_so {count} { # do symbol renaming by munging on ELF symbol table, and that # wouldn't work for .debug sections. Also, output for "info # function" changes when debug info is present. - if { [gdb_compile_shlib $solib_srcfile $solib_binfile {}] != "" } { + set addr [format 0x%x [expr $load_address + $load_increment * [expr $i-1]]] + set options [list \ + additional_flags=-Xlinker \ + additional_flags=-Ttext-segment=$addr] + if { [gdb_compile_shlib $solib_srcfile $solib_binfile $options] != "" } { untested "Failure to compile $solib_binfile_test_msg" } -- 2.25.2 Intel Deutschland GmbH Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, www.intel.de Managing Directors: Christin Eisenschmid, Gary Kershaw Chairperson of the Supervisory Board: Nicole Lau Registered Office: Munich Commercial Register: Amtsgericht Muenchen HRB 186928