- Drop obsoleted `gdb-archer-pie-0315-breakpoint_address_match.patch'.
- Do not consider memory error on reading _r_debug->r_map as fatal (BZ 576742). - PIE: Attach binary even after re-prelinked underneath. - PIE: Attach binary even after ld.so re-prelinked underneath. - PIE: Fix occasional error attaching i686 binary (BZ 576742). - testsuite: Fix unstable results of gdb.base/prelink.exp.
This commit is contained in:
parent
2770a5f431
commit
7b8bd72d9a
|
@ -0,0 +1,68 @@
|
||||||
|
http://sourceware.org/ml/gdb-patches/2010-03/msg01006.html
|
||||||
|
Subject: [patch or FYI] testsuite: Fix prelink.exp on system w/unprelinked system libs
|
||||||
|
|
||||||
|
Hi,
|
||||||
|
|
||||||
|
this is a more conservative variant superseded by:
|
||||||
|
[patch 4/6] testsuite: Unify to lib/prelink-support.exp
|
||||||
|
http://sourceware.org/ml/gdb-patches/2010-03/msg01002.html
|
||||||
|
where gdb.base/prelink.exp is reworked on generic lib/prelink-support.exp.
|
||||||
|
|
||||||
|
I prefer the [patch 4/6] over this patch but this mail can serve also as an
|
||||||
|
illustration of the current problem.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
If your system for some reason currently does not have all the libraries
|
||||||
|
prelinked gdb.base/prelink.exp will get UNRESOLVED randomly also affecting
|
||||||
|
testsuite results diff.
|
||||||
|
|
||||||
|
Apparently the testcase already tried to avoid any system libraries
|
||||||
|
dependencies by "-nodefaultlibs". But currently it does has not worked that
|
||||||
|
way.
|
||||||
|
|
||||||
|
"-lm" is contained already even in dejagnu's default_target_compile (not just
|
||||||
|
in gdb/testsuite/lib/ada.exp). But I do not know why it is there and which
|
||||||
|
systems would get broken by some global gdb/testsuite/ "-lm" removal.
|
||||||
|
|
||||||
|
|
||||||
|
Thanks,
|
||||||
|
Jan
|
||||||
|
|
||||||
|
|
||||||
|
2010-03-29 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
Fix testcase false UNRESOLVED if system libraries are not prelinked.
|
||||||
|
* gdb.base/prelink.exp: New variables compile, board, err and mathlib.
|
||||||
|
Set clear board mathlib for ${libfile} compilation.
|
||||||
|
|
||||||
|
--- a/gdb/testsuite/gdb.base/prelink.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.base/prelink.exp
|
||||||
|
@@ -42,7 +42,25 @@ set testfile "prelink"
|
||||||
|
|
||||||
|
set libsrcfile ${testfile}-lib.c
|
||||||
|
set libfile ${objdir}/${subdir}/${testfile}.so
|
||||||
|
-if { [gdb_compile "${srcdir}/${subdir}/${libsrcfile}" "${libfile}" executable [list debug "additional_flags=-fpic -shared -nodefaultlibs"]] != ""} {
|
||||||
|
+
|
||||||
|
+# default_target_compile would otherwise add "-lm" making the testcase
|
||||||
|
+# dependent on whether the system libraries are already prelinked.
|
||||||
|
+# prelink: Could not set /lib64/libm-2.11.1.so owner or mode: Operation not permitted
|
||||||
|
+set compile {
|
||||||
|
+ gdb_compile "${srcdir}/${subdir}/${libsrcfile}" "${libfile}" executable [list debug "additional_flags=-fpic -shared -nodefaultlibs"]
|
||||||
|
+}
|
||||||
|
+set board [target_info name]
|
||||||
|
+if [board_info $board exists mathlib] {
|
||||||
|
+ set mathlib [board_info $dest mathlib]
|
||||||
|
+ set_board_info mathlib ""
|
||||||
|
+ set err [eval $compile]
|
||||||
|
+ set_board_info mathlib $mathlib
|
||||||
|
+} else {
|
||||||
|
+ set_board_info mathlib ""
|
||||||
|
+ set err [eval $compile]
|
||||||
|
+ unset_board_info mathlib
|
||||||
|
+}
|
||||||
|
+if {$err != ""} {
|
||||||
|
# If creating the shared library fails, maybe we don't have the right tools
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
|
@ -1,77 +0,0 @@
|
||||||
[ Forward-ported context. ]
|
|
||||||
|
|
||||||
http://sourceware.org/ml/gdb-patches/2009-11/msg00170.html
|
|
||||||
Subject: [patch 03/15] PIE: breakpoint_address_match gdbarch_addr_bit workaround
|
|
||||||
|
|
||||||
Hi,
|
|
||||||
|
|
||||||
there are already multiple cases of CORE_ADDR being masked by the width of
|
|
||||||
gdbarch_addr_bit. This specific new case was required the PIE support.
|
|
||||||
|
|
||||||
Please read the C comment in attached patch.
|
|
||||||
|
|
||||||
Checked that CORE_ADDR math operations are present on 6000+ lines of code of
|
|
||||||
GDB sources which makes it impossible to do some general fix by replacing all
|
|
||||||
a->addr < b->addr
|
|
||||||
by
|
|
||||||
addr_less_than (a->addr, b->addr)
|
|
||||||
etc.
|
|
||||||
|
|
||||||
Even with this patch I think there are still many bugs left in the operation
|
|
||||||
of x86_64 gdb debugging i386 targets. Do you find the C++ way as a viable
|
|
||||||
one?
|
|
||||||
|
|
||||||
|
|
||||||
Thanks,
|
|
||||||
Jan
|
|
||||||
|
|
||||||
|
|
||||||
gdb/
|
|
||||||
* breakpoint.c (breakpoint_address_match): New variables addr_bit and
|
|
||||||
addr_mask, initialize it. Mask addresses by ADDR_MASK.
|
|
||||||
* defs.h (CORE_ADDR): Extend the comment.
|
|
||||||
|
|
||||||
--- a/gdb/breakpoint.c
|
|
||||||
+++ b/gdb/breakpoint.c
|
|
||||||
@@ -4559,9 +4559,15 @@ static int
|
|
||||||
breakpoint_address_match (struct address_space *aspace1, CORE_ADDR addr1,
|
|
||||||
struct address_space *aspace2, CORE_ADDR addr2)
|
|
||||||
{
|
|
||||||
+ int addr_bit = gdbarch_addr_bit (target_gdbarch);
|
|
||||||
+ CORE_ADDR addr_mask = CORE_ADDR_MAX;
|
|
||||||
+
|
|
||||||
+ if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
|
|
||||||
+ addr_mask = ((CORE_ADDR) 1 << addr_bit) - 1;
|
|
||||||
+
|
|
||||||
return ((gdbarch_has_global_breakpoints (target_gdbarch)
|
|
||||||
|| aspace1 == aspace2)
|
|
||||||
- && addr1 == addr2);
|
|
||||||
+ && (addr1 & addr_mask) == (addr2 & addr_mask));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Assuming LOC1 and LOC2's types' have meaningful target addresses
|
|
||||||
--- a/gdb/defs.h
|
|
||||||
+++ b/gdb/defs.h
|
|
||||||
@@ -98,7 +98,20 @@
|
|
||||||
/* A byte from the program being debugged. */
|
|
||||||
typedef bfd_byte gdb_byte;
|
|
||||||
|
|
||||||
-/* An address in the program being debugged. Host byte order. */
|
|
||||||
+/* An address in the program being debugged. Host byte order.
|
|
||||||
+
|
|
||||||
+ Its width is the maximum width of all the supported targets. That means
|
|
||||||
+ 32-bit target will run on such GDB using 64-bit CORE_ADDR cluttering the
|
|
||||||
+ bits 32...63 with random data from internal GDB calculations. GDB currently
|
|
||||||
+ in general truncates the address width only when it is being presented/used
|
|
||||||
+ externally (such as by the paddress function).
|
|
||||||
+
|
|
||||||
+ FIXME: This is still not right as any GDB internal comparisons (such as >=)
|
|
||||||
+ of CORE_ADDR do not use the properly truncated width. As converting all the
|
|
||||||
+ CORE_ADDR operations to width-aware functions is not feasible the way out
|
|
||||||
+ could be a width-aware C++ class CORE_ADDR referencing gdbarch as its
|
|
||||||
+ constructor parameter. */
|
|
||||||
+
|
|
||||||
typedef bfd_vma CORE_ADDR;
|
|
||||||
|
|
||||||
/* The largest CORE_ADDR value. */
|
|
||||||
|
|
|
@ -0,0 +1,443 @@
|
||||||
|
http://sourceware.org/ml/gdb-patches/2010-03/msg01008.html
|
||||||
|
Subject: [patch 1/6]: PIE: Attach binary even after re-prelinked underneath
|
||||||
|
|
||||||
|
Hi,
|
||||||
|
|
||||||
|
there is a regression (against previous unreleased commits) by:
|
||||||
|
Re: RFC: Verify AT_ENTRY before using it
|
||||||
|
http://sourceware.org/ml/gdb-patches/2010-03/msg00395.html
|
||||||
|
|
||||||
|
for loading PIE executables which have changed on the disk since started.
|
||||||
|
There are in fact 3 different addresses one has to properly deal with.
|
||||||
|
|
||||||
|
This patch uses explicit "file" so it is not dependent on pending:
|
||||||
|
[patch] Attach to running but deleted executable
|
||||||
|
http://sourceware.org/ml/gdb-patches/2010-03/msg00950.html
|
||||||
|
|
||||||
|
The two copy-pasted blocks for elf32 and elf64 are "not nice" but this is the
|
||||||
|
current style in GDB.
|
||||||
|
|
||||||
|
No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu for the whole
|
||||||
|
patch series together.
|
||||||
|
|
||||||
|
|
||||||
|
Thanks,
|
||||||
|
Jan
|
||||||
|
|
||||||
|
|
||||||
|
gdb/
|
||||||
|
2010-03-29 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
Fix attaching to PIEs prelinked on the disk since their start.
|
||||||
|
* solib-svr4.c (svr4_exec_displacement): New variable arch_size.
|
||||||
|
Verify it against bfd_get_arch_size. Try to match arbitrary
|
||||||
|
displacement for the phdrs comparison.
|
||||||
|
|
||||||
|
gdb/testsuite/
|
||||||
|
2010-03-29 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
* gdb.base/break-interp.exp: Run $binpie with new value "ATTACH", new
|
||||||
|
code for it. New variable relink_args.
|
||||||
|
(prelinkYES): Call prelinkNO.
|
||||||
|
(test_attach): Accept new parameter relink_args. Re-prelink the binary
|
||||||
|
in such case. Move the core code to ...
|
||||||
|
(test_attach_gdb): ... a new function. Send GDB command "file".
|
||||||
|
Extend expected "Attaching to " string.
|
||||||
|
|
||||||
|
--- a/gdb/solib-svr4.c
|
||||||
|
+++ b/gdb/solib-svr4.c
|
||||||
|
@@ -1750,13 +1750,183 @@ svr4_exec_displacement (CORE_ADDR *displacementp)
|
||||||
|
really do not match. */
|
||||||
|
int phdrs_size, phdrs2_size, ok = 1;
|
||||||
|
gdb_byte *buf, *buf2;
|
||||||
|
+ int arch_size;
|
||||||
|
|
||||||
|
- buf = read_program_header (-1, &phdrs_size, NULL);
|
||||||
|
+ buf = read_program_header (-1, &phdrs_size, &arch_size);
|
||||||
|
buf2 = read_program_headers_from_bfd (exec_bfd, &phdrs2_size);
|
||||||
|
- if (buf != NULL && buf2 != NULL
|
||||||
|
- && (phdrs_size != phdrs2_size
|
||||||
|
- || memcmp (buf, buf2, phdrs_size) != 0))
|
||||||
|
- ok = 0;
|
||||||
|
+ if (buf != NULL && buf2 != NULL)
|
||||||
|
+ {
|
||||||
|
+ enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
|
||||||
|
+
|
||||||
|
+ /* We are dealing with three different addresses. EXEC_BFD
|
||||||
|
+ represents current address in on-disk file. target memory content
|
||||||
|
+ may be different from EXEC_BFD as the file may have been prelinked
|
||||||
|
+ to a different address since the executable has been loaded.
|
||||||
|
+ Moreover the address of placement in target memory can be
|
||||||
|
+ different from what say the target memory program headers - this
|
||||||
|
+ is the goal of PIE.
|
||||||
|
+
|
||||||
|
+ Detected DISPLACEMENT covers both the offsets of PIE placement and
|
||||||
|
+ possible new prelink since start of the program. Here relocate
|
||||||
|
+ BUF and BUF2 just by the EXEC_BFD vs. target memory content offset
|
||||||
|
+ for the verification purpose. */
|
||||||
|
+
|
||||||
|
+ if (phdrs_size != phdrs2_size
|
||||||
|
+ || bfd_get_arch_size (exec_bfd) != arch_size)
|
||||||
|
+ ok = 0;
|
||||||
|
+ else if (arch_size == 32 && phdrs_size >= sizeof (Elf32_External_Phdr)
|
||||||
|
+ && phdrs_size % sizeof (Elf32_External_Phdr) == 0)
|
||||||
|
+ {
|
||||||
|
+ Elf_Internal_Ehdr *ehdr2 = elf_tdata (exec_bfd)->elf_header;
|
||||||
|
+ Elf_Internal_Phdr *phdr2 = elf_tdata (exec_bfd)->phdr;
|
||||||
|
+ CORE_ADDR displacement = 0;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ /* DISPLACEMENT could be found easier by the difference of
|
||||||
|
+ ehdr2->e_entry but already read BUF does not contain ehdr. */
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < ehdr2->e_phnum; i++)
|
||||||
|
+ if (phdr2[i].p_type == PT_LOAD)
|
||||||
|
+ {
|
||||||
|
+ Elf32_External_Phdr *phdrp;
|
||||||
|
+ gdb_byte *buf_vaddr_p, *buf_paddr_p;
|
||||||
|
+ CORE_ADDR vaddr, paddr;
|
||||||
|
+ CORE_ADDR displacement_vaddr = 0;
|
||||||
|
+ CORE_ADDR displacement_paddr = 0;
|
||||||
|
+
|
||||||
|
+ phdrp = &((Elf32_External_Phdr *) buf)[i];
|
||||||
|
+ buf_vaddr_p = (gdb_byte *) &phdrp->p_vaddr;
|
||||||
|
+ buf_paddr_p = (gdb_byte *) &phdrp->p_paddr;
|
||||||
|
+
|
||||||
|
+ vaddr = extract_unsigned_integer (buf_vaddr_p, 4,
|
||||||
|
+ byte_order);
|
||||||
|
+ displacement_vaddr = vaddr - phdr2[i].p_vaddr;
|
||||||
|
+
|
||||||
|
+ paddr = extract_unsigned_integer (buf_paddr_p, 4,
|
||||||
|
+ byte_order);
|
||||||
|
+ displacement_paddr = paddr - phdr2[i].p_paddr;
|
||||||
|
+
|
||||||
|
+ if (displacement_vaddr == displacement_paddr)
|
||||||
|
+ displacement = displacement_vaddr;
|
||||||
|
+
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Now compare BUF and BUF2 with optional DISPLACEMENT. */
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < phdrs_size / sizeof (Elf32_External_Phdr); i++)
|
||||||
|
+ {
|
||||||
|
+ Elf32_External_Phdr *phdrp;
|
||||||
|
+ Elf32_External_Phdr *phdr2p;
|
||||||
|
+ gdb_byte *buf_vaddr_p, *buf_paddr_p;
|
||||||
|
+ CORE_ADDR vaddr, paddr;
|
||||||
|
+
|
||||||
|
+ phdrp = &((Elf32_External_Phdr *) buf)[i];
|
||||||
|
+ buf_vaddr_p = (gdb_byte *) &phdrp->p_vaddr;
|
||||||
|
+ buf_paddr_p = (gdb_byte *) &phdrp->p_paddr;
|
||||||
|
+ phdr2p = &((Elf32_External_Phdr *) buf2)[i];
|
||||||
|
+
|
||||||
|
+ /* PT_GNU_STACK addresses are left as zero not being
|
||||||
|
+ relocated by prelink, their displacing would create false
|
||||||
|
+ verification failure. Feel free to test the unrelocated
|
||||||
|
+ comparison for any segment type. */
|
||||||
|
+
|
||||||
|
+ if (memcmp (phdrp, phdr2p, sizeof (*phdrp)) == 0)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ vaddr = extract_unsigned_integer (buf_vaddr_p, 4, byte_order);
|
||||||
|
+ vaddr -= displacement;
|
||||||
|
+ store_unsigned_integer (buf_vaddr_p, 4, byte_order, vaddr);
|
||||||
|
+
|
||||||
|
+ paddr = extract_unsigned_integer (buf_paddr_p, 4, byte_order);
|
||||||
|
+ paddr -= displacement;
|
||||||
|
+ store_unsigned_integer (buf_paddr_p, 4, byte_order, paddr);
|
||||||
|
+
|
||||||
|
+ if (memcmp (phdrp, phdr2p, sizeof (*phdrp)) == 0)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ ok = 0;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else if (arch_size == 64 && phdrs_size >= sizeof (Elf64_External_Phdr)
|
||||||
|
+ && phdrs_size % sizeof (Elf64_External_Phdr) == 0)
|
||||||
|
+ {
|
||||||
|
+ Elf_Internal_Ehdr *ehdr2 = elf_tdata (exec_bfd)->elf_header;
|
||||||
|
+ Elf_Internal_Phdr *phdr2 = elf_tdata (exec_bfd)->phdr;
|
||||||
|
+ CORE_ADDR displacement = 0;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ /* DISPLACEMENT could be found easier by the difference of
|
||||||
|
+ ehdr2->e_entry but already read BUF does not contain ehdr. */
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < ehdr2->e_phnum; i++)
|
||||||
|
+ if (phdr2[i].p_type == PT_LOAD)
|
||||||
|
+ {
|
||||||
|
+ Elf64_External_Phdr *phdrp;
|
||||||
|
+ gdb_byte *buf_vaddr_p, *buf_paddr_p;
|
||||||
|
+ CORE_ADDR vaddr, paddr;
|
||||||
|
+ CORE_ADDR displacement_vaddr = 0;
|
||||||
|
+ CORE_ADDR displacement_paddr = 0;
|
||||||
|
+
|
||||||
|
+ phdrp = &((Elf64_External_Phdr *) buf)[i];
|
||||||
|
+ buf_vaddr_p = (gdb_byte *) &phdrp->p_vaddr;
|
||||||
|
+ buf_paddr_p = (gdb_byte *) &phdrp->p_paddr;
|
||||||
|
+
|
||||||
|
+ vaddr = extract_unsigned_integer (buf_vaddr_p, 8,
|
||||||
|
+ byte_order);
|
||||||
|
+ displacement_vaddr = vaddr - phdr2[i].p_vaddr;
|
||||||
|
+
|
||||||
|
+ paddr = extract_unsigned_integer (buf_paddr_p, 8,
|
||||||
|
+ byte_order);
|
||||||
|
+ displacement_paddr = paddr - phdr2[i].p_paddr;
|
||||||
|
+
|
||||||
|
+ if (displacement_vaddr == displacement_paddr)
|
||||||
|
+ displacement = displacement_vaddr;
|
||||||
|
+
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Now compare BUF and BUF2 with optional DISPLACEMENT. */
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < phdrs_size / sizeof (Elf64_External_Phdr); i++)
|
||||||
|
+ {
|
||||||
|
+ Elf64_External_Phdr *phdrp;
|
||||||
|
+ Elf64_External_Phdr *phdr2p;
|
||||||
|
+ gdb_byte *buf_vaddr_p, *buf_paddr_p;
|
||||||
|
+ CORE_ADDR vaddr, paddr;
|
||||||
|
+
|
||||||
|
+ phdrp = &((Elf64_External_Phdr *) buf)[i];
|
||||||
|
+ buf_vaddr_p = (gdb_byte *) &phdrp->p_vaddr;
|
||||||
|
+ buf_paddr_p = (gdb_byte *) &phdrp->p_paddr;
|
||||||
|
+ phdr2p = &((Elf64_External_Phdr *) buf2)[i];
|
||||||
|
+
|
||||||
|
+ /* PT_GNU_STACK addresses are left as zero not being
|
||||||
|
+ relocated by prelink, their displacing would create false
|
||||||
|
+ verification failure. Feel free to test the unrelocated
|
||||||
|
+ comparison for any segment type. */
|
||||||
|
+
|
||||||
|
+ if (memcmp (phdrp, phdr2p, sizeof (*phdrp)) == 0)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ vaddr = extract_unsigned_integer (buf_vaddr_p, 8, byte_order);
|
||||||
|
+ vaddr -= displacement;
|
||||||
|
+ store_unsigned_integer (buf_vaddr_p, 8, byte_order, vaddr);
|
||||||
|
+
|
||||||
|
+ paddr = extract_unsigned_integer (buf_paddr_p, 8, byte_order);
|
||||||
|
+ paddr -= displacement;
|
||||||
|
+ store_unsigned_integer (buf_paddr_p, 8, byte_order, paddr);
|
||||||
|
+
|
||||||
|
+ if (memcmp (phdrp, phdr2p, sizeof (*phdrp)) == 0)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ ok = 0;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ ok = 0;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
xfree (buf);
|
||||||
|
xfree (buf2);
|
||||||
|
--- a/gdb/testsuite/gdb.base/break-interp.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.base/break-interp.exp
|
||||||
|
@@ -154,6 +154,12 @@ proc prelinkYES {arg {name ""}} {
|
||||||
|
if {$name == ""} {
|
||||||
|
set name [file tail $arg]
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ # Try to unprelink it first so that if it has been already prelinked before
|
||||||
|
+ # we get different address now and the result is not affected by the
|
||||||
|
+ # previous $arg state..
|
||||||
|
+ prelinkNO $arg "$name pre-unprelink"
|
||||||
|
+
|
||||||
|
set test "prelink $name"
|
||||||
|
set command "exec /usr/sbin/prelink -qNR --no-exec-shield $arg"
|
||||||
|
verbose -log "command is $command"
|
||||||
|
@@ -319,38 +325,12 @@ proc test_core {file displacement} {
|
||||||
|
set pf_prefix $old_ldprefix
|
||||||
|
}
|
||||||
|
|
||||||
|
-proc test_attach {file displacement} {
|
||||||
|
- global board_info gdb_prompt expect_out
|
||||||
|
-
|
||||||
|
- gdb_exit
|
||||||
|
-
|
||||||
|
- set test "sleep function started"
|
||||||
|
-
|
||||||
|
- set command "${file} sleep"
|
||||||
|
- set res [remote_spawn host $command];
|
||||||
|
- if { $res < 0 || $res == "" } {
|
||||||
|
- perror "Spawning $command failed."
|
||||||
|
- fail $test
|
||||||
|
- return
|
||||||
|
- }
|
||||||
|
- set pid [exp_pid -i $res]
|
||||||
|
- gdb_expect {
|
||||||
|
- -re "sleeping\r\n" {
|
||||||
|
- pass $test
|
||||||
|
- }
|
||||||
|
- eof {
|
||||||
|
- fail "$test (eof)"
|
||||||
|
- return
|
||||||
|
- }
|
||||||
|
- timeout {
|
||||||
|
- fail "$test (timeout)"
|
||||||
|
- return
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
+proc test_attach_gdb {file pid displacement prefix} {
|
||||||
|
+ global gdb_prompt expect_out
|
||||||
|
|
||||||
|
global pf_prefix
|
||||||
|
set old_ldprefix $pf_prefix
|
||||||
|
- lappend pf_prefix "attach:"
|
||||||
|
+ lappend pf_prefix "$prefix:"
|
||||||
|
|
||||||
|
gdb_exit
|
||||||
|
gdb_start
|
||||||
|
@@ -358,9 +338,13 @@ proc test_attach {file displacement} {
|
||||||
|
# Print the "PIE (Position Independent Executable) displacement" message.
|
||||||
|
gdb_test "set verbose on"
|
||||||
|
|
||||||
|
+ if {$file != ""} {
|
||||||
|
+ gdb_test "file $file" "Reading symbols from .*done\\." "file"
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
set test "attach"
|
||||||
|
gdb_test_multiple "attach $pid" $test {
|
||||||
|
- -re "Attaching to process $pid\r\n" {
|
||||||
|
+ -re "Attaching to (program: .*, )?process $pid\r\n" {
|
||||||
|
# Missing "$gdb_prompt $" is intentional.
|
||||||
|
pass $test
|
||||||
|
}
|
||||||
|
@@ -396,11 +380,56 @@ proc test_attach {file displacement} {
|
||||||
|
gdb_test "bt" "#\[0-9\]+ +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#\[0-9\]+ +\[^\r\n\]*\\mmain\\M.*" "attach main bt"
|
||||||
|
gdb_exit
|
||||||
|
|
||||||
|
- remote_exec host "kill -9 $pid"
|
||||||
|
-
|
||||||
|
set pf_prefix $old_ldprefix
|
||||||
|
}
|
||||||
|
|
||||||
|
+proc test_attach {file displacement {relink_args ""}} {
|
||||||
|
+ global board_info
|
||||||
|
+
|
||||||
|
+ gdb_exit
|
||||||
|
+
|
||||||
|
+ set test "sleep function started"
|
||||||
|
+
|
||||||
|
+ set command "${file} sleep"
|
||||||
|
+ set res [remote_spawn host $command];
|
||||||
|
+ if { $res < 0 || $res == "" } {
|
||||||
|
+ perror "Spawning $command failed."
|
||||||
|
+ fail $test
|
||||||
|
+ return
|
||||||
|
+ }
|
||||||
|
+ set pid [exp_pid -i $res]
|
||||||
|
+ gdb_expect {
|
||||||
|
+ -re "sleeping\r\n" {
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+ eof {
|
||||||
|
+ fail "$test (eof)"
|
||||||
|
+ return
|
||||||
|
+ }
|
||||||
|
+ timeout {
|
||||||
|
+ fail "$test (timeout)"
|
||||||
|
+ return
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if {$relink_args == ""} {
|
||||||
|
+ test_attach_gdb "" $pid $displacement "attach"
|
||||||
|
+ } else {
|
||||||
|
+ # These could be rather passed as arguments.
|
||||||
|
+ global exec interp_saved interp
|
||||||
|
+
|
||||||
|
+ foreach relink {YES NO} {
|
||||||
|
+ if {[prelink$relink $relink_args [file tail $exec]]
|
||||||
|
+ && [copy $interp_saved $interp]} {
|
||||||
|
+ # /proc/PID/exe cannot be loaded as it is "EXECNAME (deleted)".
|
||||||
|
+ test_attach_gdb $exec $pid $displacement "attach-relink$relink"
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ remote_exec host "kill -9 $pid"
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
proc test_ld {file ifmain trynosym displacement} {
|
||||||
|
global srcdir subdir gdb_prompt expect_out
|
||||||
|
|
||||||
|
@@ -609,7 +638,10 @@ foreach ldprelink {NO YES} {
|
||||||
|
set old_binprefix $pf_prefix
|
||||||
|
foreach binprelink {NO YES} {
|
||||||
|
foreach binsepdebug {NO IN SEP} {
|
||||||
|
- foreach binpie {NO YES} {
|
||||||
|
+ # "ATTACH" is like "YES" but it is modified during run.
|
||||||
|
+ # It cannot be used for problem reproducibility after the
|
||||||
|
+ # testcase ends.
|
||||||
|
+ foreach binpie {NO YES ATTACH} {
|
||||||
|
# This combination is not possible, non-PIE (fixed address)
|
||||||
|
# binary cannot be prelinked to any (other) address.
|
||||||
|
if {$binprelink == "YES" && $binpie == "NO"} {
|
||||||
|
@@ -628,7 +660,7 @@ foreach ldprelink {NO YES} {
|
||||||
|
if {$binsepdebug != "NO"} {
|
||||||
|
lappend opts {debug}
|
||||||
|
}
|
||||||
|
- if {$binpie == "YES"} {
|
||||||
|
+ if {$binpie != "NO"} {
|
||||||
|
lappend opts {additional_flags=-fPIE -pie}
|
||||||
|
}
|
||||||
|
if {[build_executable ${test}.exp [file tail $exec] $srcfile $opts] == -1} {
|
||||||
|
@@ -680,16 +712,45 @@ foreach ldprelink {NO YES} {
|
||||||
|
lappend dests $dest
|
||||||
|
}
|
||||||
|
|
||||||
|
- if {[prelink$binprelink "--dynamic-linker=$interp --ld-library-path=$dir $exec $interp [concat $dests]" [file tail $exec]]
|
||||||
|
+ if {$binpie == "NO"} {
|
||||||
|
+ set displacement "NONE"
|
||||||
|
+ } elseif {$binprelink == "NO"} {
|
||||||
|
+ set displacement "NONZERO"
|
||||||
|
+ } else {
|
||||||
|
+ set displacement "ZERO"
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ set relink_args "--dynamic-linker=$interp --ld-library-path=$dir $exec $interp [concat $dests]"
|
||||||
|
+ if {[prelink$binprelink $relink_args [file tail $exec]]
|
||||||
|
&& [copy $interp_saved $interp]} {
|
||||||
|
- if {$binpie == "NO"} {
|
||||||
|
- set displacement "NONE"
|
||||||
|
- } elseif {$binprelink == "NO"} {
|
||||||
|
- set displacement "NONZERO"
|
||||||
|
+ if {$binpie != "ATTACH"} {
|
||||||
|
+ test_ld $exec 1 [expr {$binsepdebug == "NO"}] $displacement
|
||||||
|
} else {
|
||||||
|
- set displacement "ZERO"
|
||||||
|
+ # If the file has been randomly prelinked it must
|
||||||
|
+ # be "NONZERO". We could see "ZERO" only if it was
|
||||||
|
+ # unprelinked na it is now running at the same
|
||||||
|
+ # address - which is 0 but executable can never run
|
||||||
|
+ # at address 0.
|
||||||
|
+
|
||||||
|
+ set displacement "NONZERO"
|
||||||
|
+ test_attach $exec $displacement $relink_args
|
||||||
|
+
|
||||||
|
+ # ATTACH executables + libraries get modified since
|
||||||
|
+ # they have been run. They cannot be used for
|
||||||
|
+ # problem reproducibility after the testcase ends.
|
||||||
|
+ set exec_debug [system_debug_get $exec]
|
||||||
|
+ if {$exec_debug != ""} {
|
||||||
|
+ # `file delete [glob "${exec_debug}*"]' does not work.
|
||||||
|
+ foreach f [glob "${exec_debug}*"] {
|
||||||
|
+ file delete $f
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ file delete -force $dir
|
||||||
|
+ # `file delete [glob "${exec}*"]' does not work.
|
||||||
|
+ foreach f [glob "${exec}*"] {
|
||||||
|
+ file delete $f
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
- test_ld $exec 1 [expr {$binsepdebug == "NO"}] $displacement
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
http://sourceware.org/ml/gdb-patches/2010-03/msg01000.html
|
||||||
|
Subject: [patch 2/6] PIE: Attach binary even after ld.so re-prelinked underneath
|
||||||
|
|
||||||
|
Hi,
|
||||||
|
|
||||||
|
when I have seen the PIE-binary-changed-sice-start tested also
|
||||||
|
ld.so-changed-since-start and it did not work.
|
||||||
|
|
||||||
|
There is questionable when to print and when to not to print non-fatal memory
|
||||||
|
read errors. Similar change I requested in
|
||||||
|
Re: [RFC/ia64] memory error when reading wrong core file
|
||||||
|
http://sourceware.org/ml/gdb-patches/2010-02/msg00001.html
|
||||||
|
so that GDB prints at least as a warning
|
||||||
|
Cannot access memory at address ...
|
||||||
|
when some unexpected error happens.
|
||||||
|
|
||||||
|
Contrary to it there is not such warning present in the code below as in the
|
||||||
|
case of non-valgrind PIE with re-prelinked ld.so the memory read error happens
|
||||||
|
there. Some GDB code rework could probably avoid it.
|
||||||
|
|
||||||
|
Just for example all the memory read errors in read_program_header or even
|
||||||
|
- primarily - scan_dyntag are currently IMO-incorrectly silent and others.
|
||||||
|
Therefore posted the patch this way, making all these warnings printed and
|
||||||
|
possibly fixing code attempting incorrect reads along the way could be done by
|
||||||
|
a different patch.
|
||||||
|
|
||||||
|
No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu for the whole
|
||||||
|
patch series together.
|
||||||
|
|
||||||
|
|
||||||
|
Thanks,
|
||||||
|
Jan
|
||||||
|
|
||||||
|
|
||||||
|
gdb/
|
||||||
|
2010-03-29 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
* auxv.c (ld_so_xfer_auxv): Do not error on failed read of data_address.
|
||||||
|
|
||||||
|
gdb/testsuite/
|
||||||
|
2010-03-29 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
* gdb.base/break-interp.exp (test_attach): Keep $interp changed. Move
|
||||||
|
its restore after the <$relink_args != ""> loop. new comment.
|
||||||
|
|
||||||
|
--- a/gdb/auxv.c
|
||||||
|
+++ b/gdb/auxv.c
|
||||||
|
@@ -96,7 +96,16 @@ ld_so_xfer_auxv (gdb_byte *readbuf,
|
||||||
|
|
||||||
|
pointer_address = SYMBOL_VALUE_ADDRESS (msym);
|
||||||
|
|
||||||
|
- data_address = read_memory_typed_address (pointer_address, ptr_type);
|
||||||
|
+ /* While it is an error I am not aware how to solve attaching to PIE under
|
||||||
|
+ valgrind --db-attach=yes different way when ld.so on-disk file has prelink
|
||||||
|
+ change in the meantime. Currently GDB will drop back to procfs_xfer_auxv
|
||||||
|
+ (so that at least non-valgrind PIE attachments with prelink change of
|
||||||
|
+ ld.so work). To make it working even with valgrind is PR 11440 requiring
|
||||||
|
+ a valgrind extension. */
|
||||||
|
+ if (target_read_memory (pointer_address, ptr_buf, ptr_size) != 0)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ data_address = extract_typed_address (ptr_buf, ptr_type);
|
||||||
|
|
||||||
|
/* Possibly still not initialized such as during an inferior startup. */
|
||||||
|
if (data_address == 0)
|
||||||
|
--- a/gdb/testsuite/gdb.base/break-interp.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.base/break-interp.exp
|
||||||
|
@@ -419,12 +419,16 @@ proc test_attach {file displacement {relink_args ""}} {
|
||||||
|
global exec interp_saved interp
|
||||||
|
|
||||||
|
foreach relink {YES NO} {
|
||||||
|
- if {[prelink$relink $relink_args [file tail $exec]]
|
||||||
|
- && [copy $interp_saved $interp]} {
|
||||||
|
+ # It would be more correct to also [copy $interp_saved $interp]
|
||||||
|
+ # here to really test just different prelink of $exec.
|
||||||
|
+ # But we would need a separate test for different prelink of ld.so
|
||||||
|
+ # where a bug occured. It is now all merged into this single test.
|
||||||
|
+ if [prelink$relink $relink_args [file tail $exec]] {
|
||||||
|
# /proc/PID/exe cannot be loaded as it is "EXECNAME (deleted)".
|
||||||
|
test_attach_gdb $exec $pid $displacement "attach-relink$relink"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ copy $interp_saved $interp
|
||||||
|
}
|
||||||
|
|
||||||
|
remote_exec host "kill -9 $pid"
|
||||||
|
|
|
@ -0,0 +1,412 @@
|
||||||
|
http://sourceware.org/ml/gdb-patches/2010-03/msg01001.html
|
||||||
|
Subject: [patch 3/6] PIE: Fix occasional error attaching i686 binary
|
||||||
|
|
||||||
|
[ Testcase diff backported. ]
|
||||||
|
|
||||||
|
Hi,
|
||||||
|
|
||||||
|
this is the real bugreport which started this patch series.
|
||||||
|
gdb "Cannot access memory" on a running process
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=576742
|
||||||
|
|
||||||
|
Offsets on i686 cause that while attaching to an unprelinked running PIE
|
||||||
|
scan_dyntag will incorrectly get a successful read in scan_dyntag from DT_DEBUG
|
||||||
|
it expects is from the mani executable but in fact it is from some ld.so or
|
||||||
|
libc.so (located low for --exec-shield). Another issue is that scan_dyntag
|
||||||
|
could verify more that the target memory matches the .dynamic section it is
|
||||||
|
reading from exec_bfd. It could also complain when the read failed (as always
|
||||||
|
failed so for for PIE attaches first, succeeded later so nobody has noticed
|
||||||
|
anything).
|
||||||
|
|
||||||
|
The successful read reads a bogus DT_DEBUG value and GDB errors on it later.
|
||||||
|
This is again a non-fatal error after the patch by Joel Brobecker above but it
|
||||||
|
was not so before and it is incorrect anyway.
|
||||||
|
|
||||||
|
The svr4_relocate_main_executable call in svr4_special_symbol_handling was
|
||||||
|
there before delayed that way for svr4_static_exec_displacement.
|
||||||
|
But svr4_static_exec_displacement has been removed in the meantime by:
|
||||||
|
Re: RFC: Verify AT_ENTRY before using it
|
||||||
|
http://sourceware.org/ml/gdb-patches/2010-03/msg00030.html
|
||||||
|
|
||||||
|
So it can be simplified + corrected now. Moreover GDB will now finally print
|
||||||
|
exactly "Using PIE (Position Independent Executable) displacement" exactly
|
||||||
|
once.
|
||||||
|
|
||||||
|
The reproducer depends on various offsets which may be distro dependent but it
|
||||||
|
was made so that it is hopefully reproducible everywhere. Reproduced + fixed
|
||||||
|
on Fedora 12 x86_64 and i686.
|
||||||
|
|
||||||
|
No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu for the whole
|
||||||
|
patch series together.
|
||||||
|
|
||||||
|
|
||||||
|
Thanks,
|
||||||
|
Jan
|
||||||
|
|
||||||
|
|
||||||
|
gdb/
|
||||||
|
2010-03-29 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
* auxv.c (memory_xfer_auxv): Update attach comment.
|
||||||
|
* solib-svr4.c (svr4_special_symbol_handling): Remove the call to
|
||||||
|
svr4_relocate_main_executable.
|
||||||
|
(svr4_solib_create_inferior_hook): Make the call to
|
||||||
|
svr4_relocate_main_executable unconditional.
|
||||||
|
|
||||||
|
gdb/testsuite/
|
||||||
|
2010-03-29 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
* gdb.base/attach-pie-misread.exp, gdb.base/attach-pie-misread.c: New.
|
||||||
|
|
||||||
|
--- a/gdb/auxv.c
|
||||||
|
+++ b/gdb/auxv.c
|
||||||
|
@@ -198,7 +198,8 @@ memory_xfer_auxv (struct target_ops *ops,
|
||||||
|
|
||||||
|
/* ld_so_xfer_auxv is the only function safe for virtual executables being
|
||||||
|
executed by valgrind's memcheck. As using ld_so_xfer_auxv is problematic
|
||||||
|
- during inferior startup GDB does call it only for attached processes. */
|
||||||
|
+ during inferior startup as ld.so symbol tables are not yet relocated GDB
|
||||||
|
+ calls ld_so_xfer_auxv only for attached processes. */
|
||||||
|
|
||||||
|
if (current_inferior ()->attach_flag != 0)
|
||||||
|
{
|
||||||
|
--- a/gdb/solib-svr4.c
|
||||||
|
+++ b/gdb/solib-svr4.c
|
||||||
|
@@ -1628,7 +1628,6 @@ enable_break (struct svr4_info *info, int from_tty)
|
||||||
|
static void
|
||||||
|
svr4_special_symbol_handling (void)
|
||||||
|
{
|
||||||
|
- svr4_relocate_main_executable ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read the ELF program headers from ABFD. Return the contents and
|
||||||
|
@@ -2065,8 +2064,7 @@ svr4_solib_create_inferior_hook (int from_tty)
|
||||||
|
info = get_svr4_info ();
|
||||||
|
|
||||||
|
/* Relocate the main executable if necessary. */
|
||||||
|
- if (current_inferior ()->attach_flag == 0)
|
||||||
|
- svr4_relocate_main_executable ();
|
||||||
|
+ svr4_relocate_main_executable ();
|
||||||
|
|
||||||
|
if (!svr4_have_link_map_offsets ())
|
||||||
|
return;
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gdb/testsuite/gdb.base/attach-pie-misread.c
|
||||||
|
@@ -0,0 +1,47 @@
|
||||||
|
+/* This testcase is part of GDB, the GNU debugger.
|
||||||
|
+
|
||||||
|
+ Copyright 2010 Free Software Foundation, Inc.
|
||||||
|
+
|
||||||
|
+ This program is free software; you can redistribute it and/or modify
|
||||||
|
+ it under the terms of the GNU General Public License as published by
|
||||||
|
+ the Free Software Foundation; either version 3 of the License, or
|
||||||
|
+ (at your option) any later version.
|
||||||
|
+
|
||||||
|
+ This program is distributed in the hope that it will be useful,
|
||||||
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+ You should have received a copy of the GNU General Public License
|
||||||
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
+
|
||||||
|
+const char stub[] = {
|
||||||
|
+#ifdef GEN
|
||||||
|
+# include GEN
|
||||||
|
+#endif
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+main (int argc, char **argv)
|
||||||
|
+{
|
||||||
|
+ /* Generator of GEN written in Python takes about 15s for x86_64's 4MB. */
|
||||||
|
+ if (argc == 2)
|
||||||
|
+ {
|
||||||
|
+ long count = strtol (argv[1], NULL, 0);
|
||||||
|
+
|
||||||
|
+ while (count-- > 0)
|
||||||
|
+ puts ("0x55,");
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ if (argc != 1)
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
+ puts ("sleeping");
|
||||||
|
+ fflush (stdout);
|
||||||
|
+
|
||||||
|
+ return sleep (60);
|
||||||
|
+}
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gdb/testsuite/gdb.base/attach-pie-misread.exp
|
||||||
|
@@ -0,0 +1,209 @@
|
||||||
|
+# Copyright 2010 Free Software Foundation, Inc.
|
||||||
|
+
|
||||||
|
+# This program is free software; you can redistribute it and/or modify
|
||||||
|
+# it under the terms of the GNU General Public License as published by
|
||||||
|
+# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
+# (at your option) any later version.
|
||||||
|
+#
|
||||||
|
+# This program is distributed in the hope that it will be useful,
|
||||||
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+# GNU General Public License for more details.
|
||||||
|
+#
|
||||||
|
+# You should have received a copy of the GNU General Public License
|
||||||
|
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
+
|
||||||
|
+# This test only works on GNU/Linux.
|
||||||
|
+if { ![isnative] || [is_remote host] || ![istarget *-linux*] || [skip_shlib_tests]} {
|
||||||
|
+ continue
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+set test "attach-pie-misread"
|
||||||
|
+set srcfile ${test}.c
|
||||||
|
+set genfile ${objdir}/${subdir}/${test}-gen.h
|
||||||
|
+set executable ${test}
|
||||||
|
+set binfile ${objdir}/${subdir}/${executable}
|
||||||
|
+
|
||||||
|
+if {[build_executable ${test}.exp $executable $srcfile [list "additional_flags=-fPIE -pie"]] == -1} {
|
||||||
|
+ return -1
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+# Program Headers:
|
||||||
|
+# Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
|
||||||
|
+# LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x134f5ec 0x134f5ec R E 0x200000
|
||||||
|
+# LOAD 0x134f5f0 0x000000000194f5f0 0x000000000194f5f0 0x1dbc60 0x214088 RW 0x200000
|
||||||
|
+# DYNAMIC 0x134f618 0x000000000194f618 0x000000000194f618 0x000200 0x000200 RW 0x8
|
||||||
|
+#
|
||||||
|
+proc read_phdr {binfile test} {
|
||||||
|
+ set readelf_program [transform readelf]
|
||||||
|
+ set command "exec $readelf_program -Wl $binfile"
|
||||||
|
+ verbose -log "command is $command"
|
||||||
|
+ set result [catch $command output]
|
||||||
|
+ verbose -log "result is $result"
|
||||||
|
+ verbose -log "output is $output"
|
||||||
|
+ if {$result != 0} {
|
||||||
|
+ fail $test
|
||||||
|
+ return
|
||||||
|
+ }
|
||||||
|
+ if ![regexp {\nProgram Headers:\n *Type [^\n]* Align\n(.*?)\n\n} $output trash phdr] {
|
||||||
|
+ fail "$test (no Program Headers)"
|
||||||
|
+ return
|
||||||
|
+ }
|
||||||
|
+ if ![regexp -line {^ *DYNAMIC +0x[0-9a-f]+ +(0x[0-9a-f]+) } $phdr trash dynamic_vaddr] {
|
||||||
|
+ fail "$test (no DYNAMIC found)"
|
||||||
|
+ return
|
||||||
|
+ }
|
||||||
|
+ verbose -log "dynamic_vaddr is $dynamic_vaddr"
|
||||||
|
+ set align_max -1
|
||||||
|
+ foreach {trash align} [regexp -line -all -inline {^ *LOAD .* (0x[0-9]+)$} $phdr] {
|
||||||
|
+ if {$align_max < $align} {
|
||||||
|
+ set align_max $align
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ verbose -log "align_max is $align_max"
|
||||||
|
+ if {$align_max == -1} {
|
||||||
|
+ fail "$test (no LOAD found)"
|
||||||
|
+ return
|
||||||
|
+ }
|
||||||
|
+ pass $test
|
||||||
|
+ return [list $dynamic_vaddr $align_max]
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+set phdr [read_phdr $binfile "readelf initial scan"]
|
||||||
|
+set dynamic_vaddr [lindex $phdr 0]
|
||||||
|
+set align_max [lindex $phdr 1]
|
||||||
|
+
|
||||||
|
+set stub_size [format 0x%x [expr "2 * $align_max - ($dynamic_vaddr & ($align_max - 1))"]]
|
||||||
|
+verbose -log "stub_size is $stub_size"
|
||||||
|
+
|
||||||
|
+# On x86_64 it is commonly about 4MB.
|
||||||
|
+if {$stub_size > 25000000} {
|
||||||
|
+ xfail "stub size $stub_size is too large"
|
||||||
|
+ return
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+set test "generate stub"
|
||||||
|
+set command "exec $binfile $stub_size >$genfile"
|
||||||
|
+verbose -log "command is $command"
|
||||||
|
+set result [catch $command output]
|
||||||
|
+verbose -log "result is $result"
|
||||||
|
+verbose -log "output is $output"
|
||||||
|
+if {$result == 0} {
|
||||||
|
+ pass $test
|
||||||
|
+} else {
|
||||||
|
+ fail $test
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+if {[build_executable ${test}.exp $executable $srcfile [list "additional_flags=-fPIE -pie -DGEN=\"$genfile\""]] == -1} {
|
||||||
|
+ return -1
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+# x86_64 file has 25MB, no need to keep it.
|
||||||
|
+file delete -- $genfile
|
||||||
|
+
|
||||||
|
+set phdr [read_phdr $binfile "readelf rebuilt with stub_size"]
|
||||||
|
+set dynamic_vaddr_prelinkno [lindex $phdr 0]
|
||||||
|
+
|
||||||
|
+set command "exec /usr/sbin/prelink -q -N --no-exec-shield -R $binfile"
|
||||||
|
+verbose -log "command is $command"
|
||||||
|
+set result [catch $command output]
|
||||||
|
+verbose -log "result is $result"
|
||||||
|
+verbose -log "output is $output"
|
||||||
|
+
|
||||||
|
+set test "prelink -R"
|
||||||
|
+if {$result == 0 && $output == ""} {
|
||||||
|
+ pass $test
|
||||||
|
+} elseif {$result == 1 && [regexp {^(couldn't execute "/usr/sbin/prelink[^\r\n]*": no such file or directory\n?)*$} $output]} {
|
||||||
|
+ untested attach-pie-misread.exp
|
||||||
|
+ return -1
|
||||||
|
+} else {
|
||||||
|
+ fail $test
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+set phdr [read_phdr $binfile "readelf with prelink -R"]
|
||||||
|
+set dynamic_vaddr_prelinkyes [lindex $phdr 0]
|
||||||
|
+
|
||||||
|
+set first_offset [format 0x%x [expr $dynamic_vaddr_prelinkyes - $dynamic_vaddr_prelinkno]]
|
||||||
|
+verbose -log "first_offset is $first_offset"
|
||||||
|
+
|
||||||
|
+set test "first offset is non-zero"
|
||||||
|
+if {$first_offset == 0} {
|
||||||
|
+ fail "$test (-fPIE -pie in effect?)"
|
||||||
|
+} else {
|
||||||
|
+ pass $test
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+set test "start inferior"
|
||||||
|
+gdb_exit
|
||||||
|
+
|
||||||
|
+set res [remote_spawn host $binfile];
|
||||||
|
+if { $res < 0 || $res == "" } {
|
||||||
|
+ perror "Spawning $binfile failed."
|
||||||
|
+ fail $test
|
||||||
|
+ return
|
||||||
|
+}
|
||||||
|
+set pid [exp_pid -i $res]
|
||||||
|
+gdb_expect {
|
||||||
|
+ -re "sleeping\r\n" {
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+ eof {
|
||||||
|
+ fail "$test (eof)"
|
||||||
|
+ remote_exec host "kill -9 $pid"
|
||||||
|
+ return
|
||||||
|
+ }
|
||||||
|
+ timeout {
|
||||||
|
+ fail "$test (timeout)"
|
||||||
|
+ remote_exec host "kill -9 $pid"
|
||||||
|
+ return
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+# Due to alignments it was reproducible with 1 on x86_64 but 2 on i686.
|
||||||
|
+foreach align_mult {1 2} {
|
||||||
|
+ set old_ldprefix $pf_prefix
|
||||||
|
+ lappend pf_prefix "shift-by-$align_mult:"
|
||||||
|
+
|
||||||
|
+ # FIXME: We believe there is enough room under FIRST_OFFSET.
|
||||||
|
+ set shifted_offset [format 0x%x [expr "$first_offset - $align_mult * $align_max"]]
|
||||||
|
+ verbose -log "shifted_offset is $shifted_offset"
|
||||||
|
+
|
||||||
|
+ set command "exec /usr/sbin/prelink -q -N --no-exec-shield -r $shifted_offset $binfile"
|
||||||
|
+ verbose -log "command is $command"
|
||||||
|
+ set result [catch $command output]
|
||||||
|
+ verbose -log "result is $result"
|
||||||
|
+ verbose -log "output is $output"
|
||||||
|
+
|
||||||
|
+ set test "prelink -r"
|
||||||
|
+ if {$result == 0 && $output == ""} {
|
||||||
|
+ pass $test
|
||||||
|
+ } else {
|
||||||
|
+ fail $test
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ clean_restart $executable
|
||||||
|
+
|
||||||
|
+ set test "attach"
|
||||||
|
+ gdb_test_multiple "attach $pid" $test {
|
||||||
|
+ -re "Attaching to program: .*, process $pid\r\n" {
|
||||||
|
+ # Missing "$gdb_prompt $" is intentional.
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ set test "error on Cannot access memory at address"
|
||||||
|
+ gdb_test_multiple "" $test {
|
||||||
|
+ -re "\r\nCannot access memory at address .*$gdb_prompt $" {
|
||||||
|
+ fail $test
|
||||||
|
+ }
|
||||||
|
+ -re "$gdb_prompt $" {
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ gdb_test "detach" "Detaching from program: .*"
|
||||||
|
+
|
||||||
|
+ set pf_prefix $old_ldprefix
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+remote_exec host "kill -9 $pid"
|
||||||
|
--- a/gdb/testsuite/gdb.base/break-interp.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.base/break-interp.exp
|
||||||
|
@@ -248,9 +248,8 @@ proc reach {func command displacement} {
|
||||||
|
}
|
||||||
|
if {$displacement == $case} {
|
||||||
|
pass $test_displacement
|
||||||
|
- # Permit multiple such messages.
|
||||||
|
set displacement "FOUND-$displacement"
|
||||||
|
- } elseif {$displacement != "FOUND-$case"} {
|
||||||
|
+ } else {
|
||||||
|
fail $test_displacement
|
||||||
|
}
|
||||||
|
exp_continue
|
||||||
|
@@ -304,9 +303,8 @@ proc test_core {file displacement} {
|
||||||
|
}
|
||||||
|
if {$displacement == $case} {
|
||||||
|
pass $test_displacement
|
||||||
|
- # Permit multiple such messages.
|
||||||
|
set displacement "FOUND-$displacement"
|
||||||
|
- } elseif {$displacement != "FOUND-$case"} {
|
||||||
|
+ } else {
|
||||||
|
fail $test_displacement
|
||||||
|
}
|
||||||
|
exp_continue
|
||||||
|
@@ -362,9 +360,8 @@ proc test_attach_gdb {file pid displacement prefix} {
|
||||||
|
}
|
||||||
|
if {$displacement == $case} {
|
||||||
|
pass $test_displacement
|
||||||
|
- # Permit multiple such messages.
|
||||||
|
set displacement "FOUND-$displacement"
|
||||||
|
- } elseif {$displacement != "FOUND-$case"} {
|
||||||
|
+ } else {
|
||||||
|
fail $test_displacement
|
||||||
|
}
|
||||||
|
exp_continue
|
||||||
|
@@ -451,9 +448,7 @@
|
||||||
|
gdb_test "bt" "#0 +\[^\r\n\]*\\mdl_main\\M.*" "dl bt"
|
||||||
|
|
||||||
|
if $ifmain {
|
||||||
|
- # Displacement message will be printed the second time on initializing
|
||||||
|
- # the linker from svr4_special_symbol_handling.
|
||||||
|
- reach "main" continue $displacement
|
||||||
|
+ reach "main" continue "NONE"
|
||||||
|
|
||||||
|
reach "libfunc" continue "NONE"
|
||||||
|
|
||||||
|
@@ -528,9 +517,8 @@ proc test_ld {file ifmain trynosym displacement} {
|
||||||
|
}
|
||||||
|
if {$displacement == $case} {
|
||||||
|
pass $test_displacement
|
||||||
|
- # Permit multiple such messages.
|
||||||
|
set displacement "FOUND-$displacement"
|
||||||
|
- } elseif {$displacement != "FOUND-$case"} {
|
||||||
|
+ } else {
|
||||||
|
fail $test_displacement
|
||||||
|
}
|
||||||
|
exp_continue
|
||||||
|
|
|
@ -69,7 +69,7 @@ Index: gdb-7.0.50.20100115/gdb/testsuite/gdb.base/break-interp.exp
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,9 +500,33 @@ foreach ldprelink {NO YES} {
|
@@ -480,9 +500,33 @@ foreach ldprelink {NO YES} {
|
||||||
if {$binpie == "YES"} {
|
if {$binpie != "NO"} {
|
||||||
lappend opts {additional_flags=-fPIE -pie}
|
lappend opts {additional_flags=-fPIE -pie}
|
||||||
}
|
}
|
||||||
- if {[build_executable ${test}.exp [file tail $exec] $srcfile $opts] == -1} {
|
- if {[build_executable ${test}.exp [file tail $exec] $srcfile $opts] == -1} {
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
[RFC/ia64] memory error when reading wrong core file
|
||||||
|
http://sourceware.org/ml/gdb-patches/2010-01/msg00645.html
|
||||||
|
http://sourceware.org/ml/gdb-patches/2010-02/msg00001.html
|
||||||
|
http://sourceware.org/ml/gdb-patches/2010-03/msg00298.html
|
||||||
|
http://sourceware.org/ml/gdb-cvs/2010-03/msg00065.html
|
||||||
|
c961a8da422283662e09ee498c0598d48fc9d70f
|
||||||
|
|
||||||
|
--- src/gdb/solib-svr4.c 2010/02/24 00:29:02 1.125
|
||||||
|
+++ src/gdb/solib-svr4.c 2010/03/08 07:45:49 1.126
|
||||||
|
@@ -868,9 +868,16 @@
|
||||||
|
{
|
||||||
|
struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
|
||||||
|
struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
|
||||||
|
+ CORE_ADDR addr = 0;
|
||||||
|
+ volatile struct gdb_exception ex;
|
||||||
|
|
||||||
|
- return read_memory_typed_address (info->debug_base + lmo->r_map_offset,
|
||||||
|
- ptr_type);
|
||||||
|
+ TRY_CATCH (ex, RETURN_MASK_ERROR)
|
||||||
|
+ {
|
||||||
|
+ addr = read_memory_typed_address (info->debug_base + lmo->r_map_offset,
|
||||||
|
+ ptr_type);
|
||||||
|
+ }
|
||||||
|
+ exception_print (gdb_stderr, ex);
|
||||||
|
+ return addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find r_brk from the inferior's debug base. */
|
||||||
|
### src/gdb/ChangeLog 2010/03/08 01:49:30 1.11441
|
||||||
|
### src/gdb/ChangeLog 2010/03/08 07:45:49 1.11442
|
||||||
|
## -1,3 +1,10 @@
|
||||||
|
+2010-03-08 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
+
|
||||||
|
+ Memory error when reading wrong core file.
|
||||||
|
+ * solib-svr4.c (solib_svr4_r_map): catch and print all exception
|
||||||
|
+ errors while reading the inferior memory, and return zero if
|
||||||
|
+ an exception was raised.
|
||||||
|
+
|
||||||
|
2010-03-07 Michael Snyder <msnyder@vmware.com>
|
||||||
|
|
||||||
|
* record.c (record_restore): Rename tmpu8 to rectype.
|
30
gdb.spec
30
gdb.spec
|
@ -36,7 +36,7 @@ Version: 7.1
|
||||||
|
|
||||||
# The release always contains a leading reserved number, start it at 1.
|
# The release always contains a leading reserved number, start it at 1.
|
||||||
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
||||||
Release: 1%{?_with_upstream:.upstream}%{dist}
|
Release: 2%{?_with_upstream:.upstream}%{dist}
|
||||||
|
|
||||||
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and GFDL and BSD and Public Domain
|
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and GFDL and BSD and Public Domain
|
||||||
Group: Development/Debuggers
|
Group: Development/Debuggers
|
||||||
|
@ -119,7 +119,6 @@ Patch118: gdb-6.3-gstack-20050411.patch
|
||||||
|
|
||||||
# VSYSCALL and PIE
|
# VSYSCALL and PIE
|
||||||
Patch122: gdb-6.3-test-pie-20050107.patch
|
Patch122: gdb-6.3-test-pie-20050107.patch
|
||||||
Patch124: gdb-archer-pie-0315-breakpoint_address_match.patch
|
|
||||||
Patch389: gdb-archer-pie-addons.patch
|
Patch389: gdb-archer-pie-addons.patch
|
||||||
Patch394: gdb-archer-pie-addons-keep-disabled.patch
|
Patch394: gdb-archer-pie-addons-keep-disabled.patch
|
||||||
|
|
||||||
|
@ -429,6 +428,19 @@ Patch429: gdb-bz562975-std-terminate-double-free.patch
|
||||||
# PIE: Fix back re-reun.
|
# PIE: Fix back re-reun.
|
||||||
Patch430: gdb-pie-rerun.patch
|
Patch430: gdb-pie-rerun.patch
|
||||||
|
|
||||||
|
# Do not consider memory error on reading _r_debug->r_map as fatal (BZ 576742).
|
||||||
|
Patch432: gdb-solib-memory-error-nonfatal.patch
|
||||||
|
|
||||||
|
# testsuite: Fix unstable results of gdb.base/prelink.exp.
|
||||||
|
Patch433: gdb-6.7-testsuite-stable-results-prelink.patch
|
||||||
|
|
||||||
|
# [patch 1/6] PIE: Attach binary even after re-prelinked underneath
|
||||||
|
# [patch 2/6] PIE: Attach binary even after ld.so re-prelinked underneath
|
||||||
|
# [patch 3/6] PIE: Fix occasional error attaching i686 binary
|
||||||
|
Patch434: gdb-pie-1of6-reprelinked-bin.patch
|
||||||
|
Patch435: gdb-pie-2of6-reprelinked-ld.patch
|
||||||
|
Patch436: gdb-pie-3of6-relocate-once.patch
|
||||||
|
|
||||||
BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
|
BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
|
||||||
Requires: readline%{?_isa}
|
Requires: readline%{?_isa}
|
||||||
BuildRequires: readline-devel%{?_isa}
|
BuildRequires: readline-devel%{?_isa}
|
||||||
|
@ -567,7 +579,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||||
%patch232 -p1
|
%patch232 -p1
|
||||||
%patch349 -p1
|
%patch349 -p1
|
||||||
%patch420 -p1
|
%patch420 -p1
|
||||||
%patch124 -p1
|
|
||||||
%patch1 -p1
|
%patch1 -p1
|
||||||
%patch3 -p1
|
%patch3 -p1
|
||||||
|
|
||||||
|
@ -679,6 +690,11 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||||
%patch422 -p1
|
%patch422 -p1
|
||||||
%patch429 -p1
|
%patch429 -p1
|
||||||
%patch430 -p1
|
%patch430 -p1
|
||||||
|
%patch432 -p1
|
||||||
|
%patch433 -p1
|
||||||
|
%patch434 -p1
|
||||||
|
%patch435 -p1
|
||||||
|
%patch436 -p1
|
||||||
|
|
||||||
%patch415 -p1
|
%patch415 -p1
|
||||||
%patch393 -p1
|
%patch393 -p1
|
||||||
|
@ -1011,6 +1027,14 @@ fi
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Mar 29 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.1-2.fc13
|
||||||
|
- Drop obsoleted `gdb-archer-pie-0315-breakpoint_address_match.patch'.
|
||||||
|
- Do not consider memory error on reading _r_debug->r_map as fatal (BZ 576742).
|
||||||
|
- PIE: Attach binary even after re-prelinked underneath.
|
||||||
|
- PIE: Attach binary even after ld.so re-prelinked underneath.
|
||||||
|
- PIE: Fix occasional error attaching i686 binary (BZ 576742).
|
||||||
|
- testsuite: Fix unstable results of gdb.base/prelink.exp.
|
||||||
|
|
||||||
* Thu Mar 25 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.1-1.fc13
|
* Thu Mar 25 2010 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.1-1.fc13
|
||||||
- Update to new FSF GDB release.
|
- Update to new FSF GDB release.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue