From: jkratoch Date: Wed, 10 Mar 2010 20:55:41 +0000 (+0000) Subject: gdb/ X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=68012343146926514c65a730438c2b7a409f9863;p=pf3gnuchains%2Fpf3gnuchains4x.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9085bb4c74..8186727bf1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,4 +1,12 @@ 2010-03-10 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-10 Jan Kratochvil Daniel Jacobowitz * solib-svr4.c (read_program_header): Support type == -1 to read diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 2ae9b50edd..d10a20977e 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1659,7 +1659,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: @@ -1699,8 +1702,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. */ @@ -1764,7 +1767,8 @@ svr4_exec_displacement (void) return 0; } - return displacement; + *displacementp = displacement; + return 1; } /* Relocate the main executable. This function should be called upon @@ -1775,11 +1779,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) {