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 CC354385E031 for ; Fri, 27 Mar 2020 10:37:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org CC354385E031 IronPort-SDR: RCJJtKXqBOhf8qqpefJ7EiUlRXCnt+aTGDOmtNI++0RjNa1/iBQJZHYu+b3oGdJnW0Ob0kinL3 cSXBZyvKxWcA== 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; 27 Mar 2020 03:37:58 -0700 IronPort-SDR: 0v/OSEK2E9Psn+D9trpoAPFM3Y6kXQGlRxHNgTin2utroj9hXHcRSioNSOyqslQ3nR7h+9x7Ft nwl7WQM6k4iA== X-IronPort-AV: E=Sophos;i="5.72,312,1580803200"; d="scan'208";a="240930348" 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; 27 Mar 2020 03:37:57 -0700 From: Mihails Strasuns To: gdb-patches@sourceware.org Subject: [PATCH v2 6/8] [gdb/testsuite] use -Ttext-segment for jit-elf tests Date: Fri, 27 Mar 2020 11:39:30 +0100 Message-Id: <20200327103932.17765-6-mihails.strasuns@intel.com> X-Mailer: git-send-email 2.25.2 In-Reply-To: <20200327103932.17765-1-mihails.strasuns@intel.com> References: <165972> <20200327103932.17765-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.7 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: Fri, 27 Mar 2020 10:38:01 -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 | 21 ++++++++++++++++++++- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/gdb/testsuite/gdb.base/jit-elf-main.c b/gdb/testsuite/gdb.base/jit-elf-main.c index 0e4b2e9a40..5bd8a05926 100644 --- a/gdb/testsuite/gdb.base/jit-elf-main.c +++ b/gdb/testsuite/gdb.base/jit-elf-main.c @@ -51,20 +51,16 @@ usage () 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) @@ -137,8 +139,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) @@ -147,7 +150,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 7e3dfd2c7a..8f17c2f972 100644 --- a/gdb/testsuite/lib/jit-elf-helpers.exp +++ b/gdb/testsuite/lib/jit-elf-helpers.exp @@ -13,15 +13,25 @@ # 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 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] != "" } { @@ -34,12 +44,15 @@ proc compile_jit_main {binsuffix options} { proc compile_jit_main_as_so {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="-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] != "" } { @@ -53,6 +66,7 @@ proc compile_jit_main_as_so {binsuffix options} { proc compile_n_jit_so {count binsuffix options} { global srcdir subdir + global load_address load_increment set solib_binfile_targets {} set solib_testfile jit-elf-solib @@ -65,7 +79,12 @@ proc compile_n_jit_so {count binsuffix options} { # 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 $options] != "" } { + set addr [format 0x%x [expr $load_address + $load_increment * [expr $i-1]]] + set comp_options [concat \ + $options \ + additional_flags=-Xlinker \ + additional_flags=-Ttext-segment=$addr] + if { [gdb_compile_shlib $solib_srcfile $solib_binfile $comp_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