From cf00ae008a2d2a784d7ca53014b40fbdfbd0d35f Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Sun, 14 Mar 2010 08:51:49 +0000 Subject: [PATCH] gdb/ * solib-svr4.c (svr4_exec_displacement): Return now success, new parameter displacementp. Update comment. (svr4_relocate_main_executable): Return if non-zero SECTION_OFFSETS element exists. Return if svr4_exec_displacement was not successful. Update comment. --- gdb/ChangeLog | 8 ++++++++ gdb/solib-svr4.c | 34 ++++++++++++++++++++++++++-------- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1408b644bb9..644f7c6effe 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2010-03-14 Jan Kratochvil + + * solib-svr4.c (svr4_exec_displacement): Return now success, new + parameter displacementp. Update comment. + (svr4_relocate_main_executable): Return if non-zero SECTION_OFFSETS + element exists. Return if svr4_exec_displacement was not successful. + Update comment. + 2010-03-14 Jan Kratochvil Daniel Jacobowitz diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 07a9ed5aed8..4dd3761d232 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1656,7 +1656,10 @@ read_program_headers_from_bfd (bfd *abfd, int *phdrs_size) return buf; } -/* We relocate all of the sections by the same amount. This +/* Return 1 and fill *DISPLACEMENTP with detected PIE offset of inferior + exec_bfd. Otherwise return 0. + + We relocate all of the sections by the same amount. This behavior is mandated by recent editions of the System V ABI. According to the System V Application Binary Interface, Edition 4.1, page 5-5: @@ -1696,8 +1699,8 @@ read_program_headers_from_bfd (bfd *abfd, int *phdrs_size) should either be removed or modified to accomodate the new file type. - Kevin, Nov 2000. ] */ -static CORE_ADDR -svr4_exec_displacement (void) +static int +svr4_exec_displacement (CORE_ADDR *displacementp) { /* ENTRY_POINT is a possible function descriptor - before a call to gdbarch_convert_from_func_ptr_addr. */ @@ -1761,7 +1764,8 @@ svr4_exec_displacement (void) return 0; } - return displacement; + *displacementp = displacement; + return 1; } /* Relocate the main executable. This function should be called upon @@ -1772,11 +1776,25 @@ svr4_exec_displacement (void) static void svr4_relocate_main_executable (void) { - CORE_ADDR displacement = svr4_exec_displacement (); + CORE_ADDR displacement; + + if (symfile_objfile) + { + int i; + + /* Remote target may have already set specific offsets by `qOffsets' + which should be preferred. */ + + for (i = 0; i < symfile_objfile->num_sections; i++) + if (ANOFFSET (symfile_objfile->section_offsets, i) != 0) + return; + } + + if (! svr4_exec_displacement (&displacement)) + return; - /* Even if DISPLACEMENT is 0 still try to relocate it as this is a new - difference of in-memory vs. in-file addresses and we could already - relocate the executable at this function to improper address before. */ + /* Even DISPLACEMENT 0 is a valid new difference of in-memory vs. in-file + addresses. */ if (symfile_objfile) { -- 2.47.3