This is the mail archive of the gdb-patches@sourceware.org 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]
Other format: [Raw text]

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


  Thanks, Tom...
  it really seems that this is the culprit:
I was freeing again already freed memory, which of course
created random crashes later.

  I send here rapidly a new patch version.
I really tested the allocation problems by adding
allocation + free'ing of each of the first parameters
used in prim_record_minimal_symbol
and it does seem that freeing of char array doesn't lead to any problem.

  So the only trouble was related to the
reallocation of section_data and seems to be fixed
thanks to Tom's proposal.

Yuanhui Zhang,
could you please check if the new patch 
suppresses the crash you had when you tried the previous version?

Thanks to everyone...

Pierre Muller


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.

> -----Message d'origine-----
> De?: gdb-patches-owner@sourceware.org [mailto:gdb-patches-
> owner@sourceware.org] De la part de Tom Tromey
> Envoyé?: lundi 26 novembre 2012 17:54
> À?: Pierre Muller
> Cc?: 'Joel Brobecker'; 'Pedro Alves'; 'Eli Zaretskii'; gdb-
> patches@sourceware.org
> Objet?: Re: [RFC-v4] Fix .text section offset for windows DLL (was Calling
> __stdcall functions in the inferior)
> 
> >>>>> "Pierre" == Pierre Muller <pierre.muller@ics-cnrs.unistra.fr>
writes:
> 
> Joel> Are we missing a cleanup/xfree?
> 
> Pierre>   I added some, please check that part, as I have
> Pierre> no experience at all with using make_cleanup
> Pierre> related functions...
> Pierre>   In particular, I didn't really get if it is OK to call
> Pierre> do_cleanups with a possibly NULL argument...
> 
> The simplest way to approach cleanups, which I recommend in nearly all
> cases, is to treat them as block-scoped and to always pass the result of
> a make_cleanup call to do_cleanups.  Try to avoid tricks with conditions
> and possibly-NULL cleanup pointers, this usually leads to trouble.
> 
> Pierre> +  struct cleanup *section_cleanup = 0;
> 
> I think there's no need to initialize this, since you re-set it later.
> 
> Pierre> +  section_data = xzalloc (PE_SECTION_TABLE_SIZE
> Pierre> +			 * sizeof (struct read_pe_section_data));
> Pierre> +
> Pierre> +  section_cleanup = make_cleanup (xfree, section_data);
> 
> Ok so far, but...
> 
> Pierre> +	  section_data = xrealloc (section_data, otherix
> Pierre> +				   * sizeof (struct
read_pe_section_data));
> 
> ... this can free the original pointer.
> 
> What you want is:
> 
>     section_cleanup = make_cleanup (free_current_contents, &section_data);
> 
> This will free the current value of the pointer, instead of capturing
> the value when the cleanup is made.
> 
> Pierre>    /* Discard expdata.  */
> Pierre>    do_cleanups (back_to);
> Pierre> +  /* Discard section_data.  */
> Pierre> +  do_cleanups (section_cleanup);
> 
> Cleanups are a stack, so you can just invoke do_cleanups on the
> outermost one.  Just delete the local variable 'back_to'.
> 
> Tom

Attachment: fix-dll-offset-v7.patch
Description: Binary data


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