Re: [RFC-v5] Fix .text section offset for windows DLL (was Calling __stdcall functions in the inferior)

asmwarrior
2012-12-07T15:23:11Z

On 2012-12-7 15:10, Joel Brobecker wrote:
>> 2012-11-25 Pierre Muller<muller@sourceware.org>
>> >
>> > * coff-pe-read.h (pe_text_section_offset): Declare new function.
>> > * coff-pe-read.c (debug_coff_pe_read): New static variable.
>> > (struct read_pe_section_data): Add section_name field.
>> > (IMAGE_SCN_CNT_CODE): New macro, if not already defined.
>> > (IMAGE_SCN_CNT_INITIALIZED_DATA): Ditto.
>> > (IMAGE_SCN_CNT_UNINITIALIZED_DATA): Ditto.
>> > (get_pe_section_index): New function.
>> > (struct pe_sections_info): New type.
>> > (get_section_vmas): Use new struct pe_sections_info.
>> > (add_pe_exported_sym): Handle unnamed exported function.
>> > (add_pe_forwarded_sym): New function.
>> > (read_pe_truncate_name): Truncate at last dot.
>> > (pe_as16): New function.
>> > (read_pe_exported_syms): Use ordinal of function to
>> > retrieve correct RVA address of function and handle
>> > forwarded symbol.
>> > (pe_text_section_offset): New function.
>> > (show_debug_coff_pe_read): New function.
>> > (_initialize_coff_pe_read): New function adding
>> > 'set/show debug coff_pe_read' commands.
>> >
>> > * windows-tdep.c (windows_xfer_shared_library): Use
>> > pe_text_section_offset function instead of possibly wrong
>> > 0x1000 constant for .text sextion offset.
> Looks good
I still has crashes, see the debug log and crash bt.

I use an un-patched gdb to debug the patched gdb. The debugee gdb crashes when try to run a exe file(codeblocks.exe)

E:\code\cb\CB_NIGHTLY>gdb_stable gdb.exe
GNU gdb (GDB) 7.5.50.20121126-cvs
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "mingw32".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from E:\code\gcc\PCXMinGW463\bin\gdb.exe...done.
(gdb) r
Starting program: E:\code\gcc\PCXMinGW463\bin\gdb.exe
[New Thread 38480.0x95a0]
GNU gdb (GDB) 7.5.50.20121207-cvs
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "mingw32".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) [New Thread 38480.0x9620]
[New Thread 38480.0x9028]
file e:/code/cb/cleantrunk/src/devel/codeblocks.exe
Reading symbols from e:\code\cb\cleantrunk\src\devel\codeblocks.exe...done.
<ciations --multiply-instance --no-splash-screen --verbose -p=debugCC
(gdb) r
Starting program: e:\code\cb\cleantrunk\src\devel\codeblocks.exe --debug-log --n
o-dde --no-check-associations --multiply-instance --no-splash-screen --verbose -
p=debugCC
[New Thread 37324.0x9270]

Program received signal SIGSEGV, Segmentation fault.
0x77c47740 in strcmp () from C:\WINDOWS\system32\msvcrt.dll
(gdb) bt
#0 0x77c47740 in strcmp () from C:\WINDOWS\system32\msvcrt.dll
#1 0x00535669 in get_pe_section_index (nb_sections=5,
sections=<optimized out>, section_name=0x576b410 ".data")
at ../../gdb/gdb/coff-pe-read.c:112
#2 get_section_vmas (abfd=0x30543d0, sectp=0x576c4c0, context=0x2a7f894)
at ../../gdb/gdb/coff-pe-read.c:133
#3 0x005f9672 in bfd_map_over_sections (abfd=0x30543d0,
operation=0x535630 <get_section_vmas>, user_storage=0x2a7f894)
at ../../gdb/bfd/section.c:1329
#4 0x00536066 in read_pe_exported_syms (objfile=0x5834090)
at ../../gdb/gdb/coff-pe-read.c:524
#5 0x00535408 in coff_symtab_read (objfile=0x5834090, nsyms=0,
symtab_offset=<optimized out>) at ../../gdb/gdb/coffread.c:1127
#6 coff_symfile_read (objfile=0x5834090, symfile_flags=8)
at ../../gdb/gdb/coffread.c:610
#7 0x004d3967 in read_symbols (objfile=0x5834090, add_flags=8)
at ../../gdb/gdb/symfile.c:885
#8 0x004d340e in syms_from_objfile (objfile=0x5834090,
addrs=<optimized out>, offsets=0x0, num_offsets=0, add_flags=8)
at ../../gdb/gdb/symfile.c:1020
#9 0x004d36f0 in symbol_file_add_with_addrs_or_offsets (
abfd=<optimized out>, add_flags=8, addrs=0x4d9d640,
flags=<optimized out>, parent=0x0, num_offsets=0, offsets=0x0)
at ../../gdb/gdb/symfile.c:1123
#10 0x005c2df7 in solib_read_symbols (so=0x2ff7ff8, flags=8)
at ../../gdb/gdb/solib.c:608
#11 0x005c322a in solib_add (pattern=0x0, from_tty=0,
target=0x96efa0 <current_target>, readsyms=1) at ../../gdb/gdb/solib.c:919
#12 0x004dfcce in post_create_inferior (target=0x96efa0 <current_target>,
from_tty=0) at ../../gdb/gdb/infcmd.c:477
#13 0x004dfe7c in run_command_1 (args=0x0, from_tty=<optimized out>,
tbreak_at_main=<optimized out>) at ../../gdb/gdb/infcmd.c:631
#14 0x005ada85 in execute_command (p=0x4cfa1b9 "", from_tty=1)
at ../../gdb/gdb/top.c:491
#15 0x004fda16 in command_handler (command=0x4cfa1b8 "")
at ../../gdb/gdb/event-top.c:429
#16 0x004fe1c3 in command_line_handler (rl=0x292888 " ")
at ../../gdb/gdb/event-top.c:630
#17 0x005df1c1 in rl_callback_read_char ()
at ../../gdb/readline/callback.c:220
#18 0x004fda88 in rl_callback_read_char_wrapper (client_data=0x0)
at ../../gdb/gdb/event-top.c:163
#19 0x004fcd84 in handle_file_event (data=...)
at ../../gdb/gdb/event-loop.c:827
#20 0x004fcd13 in process_event () at ../../gdb/gdb/event-loop.c:401
#21 process_event () at ../../gdb/gdb/event-loop.c:351
#22 0x004fd095 in gdb_do_one_event () at ../../gdb/gdb/event-loop.c:465
#23 0x004fd1ec in start_event_loop () at ../../gdb/gdb/event-loop.c:490
#24 0x004f79c2 in captured_command_loop (data=0x0) at ../../gdb/gdb/main.c:256
#25 0x004f66eb in catch_errors (func=0x4f79b0 <captured_command_loop>,
func_args=0x0, errstring=0x736c0d <__PRETTY_FUNCTION__.12471+203> "",
mask=6) at ../../gdb/gdb/exceptions.c:546
#26 0x004f84c6 in captured_main (data=0x2a7fee0) at ../../gdb/gdb/main.c:1032
#27 0x004f66eb in catch_errors (func=0x4f7b70 <captured_main>,
func_args=0x2a7fee0,
errstring=0x736c0d <__PRETTY_FUNCTION__.12471+203> "", mask=6)
at ../../gdb/gdb/exceptions.c:546
#28 0x004f8ab0 in gdb_main (args=0x2a7fee0) at ../../gdb/gdb/main.c:1041
#29 0x006d0878 in main (argc=1, argv=0x293fe0) at ../../gdb/gdb/gdb.c:34
(gdb) frame 1
#1 0x00535669 in get_pe_section_index (nb_sections=5,
sections=<optimized out>, section_name=0x576b410 ".data")
at ../../gdb/gdb/coff-pe-read.c:112
112 if (strcmp (sections[i].section_name, section_name) == 0)
(gdb) p i
$1 = <optimized out>
(gdb) p sections[i]
value has been optimized out
(gdb) p section_name
$2 = 0x576b410 ".data"
(gdb) p sections[i].section_name
value has been optimized out
(gdb) p nb_sections
$3 = 5
(gdb) p sections
$4 = <optimized out>
(gdb)

---------------------------------------------------
But it looks like a lot of variables were optimized out.

But it looks like the crash happens here:

static int
get_pe_section_index (const char *section_name,
struct read_pe_section_data *sections,
int nb_sections)
{
int i;
for (i = 0; i < nb_sections; i++)
if (strcmp (sections[i].section_name, section_name) == 0)
return i;
return PE_SECTION_INDEX_INVALID;
}

In the "strcmp" function call.

Yuanhui Zhang