[PATCH v4 3/5] [gdb/testsuite] use -Ttext-segment for jit-elf tests
Simon Marchi
simark@simark.ca
Wed Apr 22 02:08:08 GMT 2020
On 2020-04-21 9:31 a.m., Mihails Strasuns via Gdb-patches wrote:
> 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 <mihails.strasuns@intel.com>
>
> * 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.
> ---
> gdb/testsuite/gdb.base/jit-elf-main.c | 27 ++++++++++++++------------
> gdb/testsuite/lib/jit-elf-helpers.exp | 28 ++++++++++++++++++++++++---
> 2 files changed, 40 insertions(+), 15 deletions(-)
>
> diff --git a/gdb/testsuite/gdb.base/jit-elf-main.c b/gdb/testsuite/gdb.base/jit-elf-main.c
> index acfd17d417..ca150f3b1b 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 do {} while (wait_for_gdb)
> @@ -139,8 +141,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);
Space before asterisk.
Otherwise, this patch LGTM.
Simon
More information about the Gdb-patches
mailing list