This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[RFA] objfiles.c:objfile_relocate: Handle entry_point in section other than .text


GDB is unable to call functions in executables which are compiled with
maxdata > 256 MB on AIX.
A typescript of a failing GDB session is appended below after the
suggested patch.


The failure is caused due to the peculiar o_entry definition on AIX:

o_entry: Specifies the virtual address of the entry point.
For application programs, this virtual address is the address of the function
descriptor. The function descriptor contains the addresses of both the entry
point itself and its TOC anchor.


bfd_get_start_address() returns the address from o_entry, which means that
we get the address of the entry function descriptor, which usually lives in
the .data segment.
This (eventually relocated) value is used as the return value from
entry_point_address(), which is used for the call dummy breakpoint address.

For call dummy purposes, it doesn't matter that we put the breakpoint
at the function descriptor of the entry point and not at the entry point
itself.

The problem arises when the .data segment is relocated, as ei.entry_point
is always relocated with SECT_OFF_TEXT.

Here is a patch:

	* objfiles.c (objfile_relocate):  Relocate ei.entry_point with
	its section offset, use SECT_OFF_TEXT only as a fallback.

*** ./objfiles.c.orig	Fri Sep 15 21:27:21 2000
--- ./objfiles.c	Mon Oct  9 21:56:01 2000
***************
*** 642,647 ****
--- 642,659 ----
        (objfile->section_offsets)->offsets[i] = ANOFFSET (new_offsets, i);
    }
  
+   if (objfile->ei.entry_point != ~(CORE_ADDR) 0)
+     {
+       /* Relocate ei.entry_point with its section offset, use SECT_OFF_TEXT
+ 	 only as a fallback.  */
+       struct obj_section *s;
+       s = find_pc_section (objfile->ei.entry_point);
+       if (s)
+         objfile->ei.entry_point += ANOFFSET (delta, s->the_bfd_section->index);
+       else
+         objfile->ei.entry_point += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
+     }
+ 
    {
      struct obj_section *s;
      bfd *abfd;
***************
*** 657,665 ****
        }
    }
  
-   if (objfile->ei.entry_point != ~(CORE_ADDR) 0)
-     objfile->ei.entry_point += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
- 
    if (objfile->ei.entry_func_lowpc != INVALID_ENTRY_LOWPC)
      {
        objfile->ei.entry_func_lowpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
--- 669,674 ----
	

Typescript of failing GDB session:

pes@limo_2011$ gcc -g -Wl,-bmaxdata:0x20000000 gdb/testsuite/gdb.base/callfuncs.c
pes@limo_2012$ gdb a.out
GNU gdb 20000915
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "powerpc-ibm-aix4.3.3.0"...
(gdb) b main
Breakpoint 1 at 0x100012e8: file gdb/testsuite/gdb.base/callfuncs.c, line 356.
(gdb) r
Starting program: /home2/pes/gnu/gdb/gdbnd/devo/a.out

Breakpoint 1, main () at gdb/testsuite/gdb.base/callfuncs.c:356
356       malloc(1);
(gdb) p add(4,5)
warning: Cannot insert breakpoint 0:
Cannot access memory at address 0x20000aa8

-- 
Peter Schauer			pes@regent.e-technik.tu-muenchen.de

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]