RFC: Dumping of .pdata/.xdata for x64 PE+

Kai Tietz ktietz70@googlemail.com
Fri Apr 17 12:09:00 GMT 2009


2009/4/17 Dave Korn <dave.korn.cygwin@googlemail.com>:
> Kai Tietz wrote:
>
>> Ok, here is the patch
>
>> Tested for x86_64-pc-mingw32 target. Is this patch ok to apply?
>
>  I have a few comments:
>
>> +/* Note we have to make sure not all headers are protected
>> +   by closurs, so we check define PEI_HEADERS to prevent
>> +   double including in pei-x86_64.c.  */
>
>  Typo, and I'm not sure closures means that anyway; how about rewording it to
> "wrapped in #ifdef guards"?  In two places: bfd/coff-x86_64.c and
> bfd/pei-x86_64.c.  Also, gnu style item: two spaces between the end of the
> comment text and the closing "*/" (only in pei-x86_64.c), not one.
>
>> Index: src/bfd/pei-x86_64.c
>> ===================================================================
>> --- src.orig/bfd/pei-x86_64.c
>> +++ src/bfd/pei-x86_64.c
>> @@ -25,9 +25,9 @@
>>
>>  #define TARGET_SYM           x86_64pei_vec
>>  #define TARGET_NAME          "pei-x86-64"
>> -#define COFF_IMAGE_WITH_PE
>>  #define COFF_WITH_PE
>>  #define COFF_WITH_pex64
>> +#define COFF_IMAGE_WITH_PE
>>  #define PCRELOFFSET          TRUE
>>  #define TARGET_UNDERSCORE    '_'
>>  /* Long section names not allowed in executable images, only object files.  */
>
>  Might as well undo this needless change while you're at it.
>
>> +static void
>> +pep_xdata_print_uwd_codes(bfd_byte *dta, bfd_vma count, FILE *file,
>> bfd_vma pc_addr)
>
>  Always a space between function name and opening bracket.
>
>> +  /* Sort array ascending. Note: it is stored in reveresed order.  */
>
>  Typoe: reversed.  :) I'll just leave that there.
>
>> +     case 3: case 10:
>> +     case 1:
>> +     case 4: case 6: case 8:
>> +     case 5: case 7: case 9:
>> +     case 0: /* UWOP_PUSH_NONVOL.  */
>> +     case 1: /* UWOP_ALLOC_LARGE.  */
>
> .... etc., etc.: not right IMO.  If these constants aren't yet available in
> upstream w32api headers, you can always #define some proper constants
> yourself.  If there's a whole new header file defining them guess you may need
> to add an autoconf test for it?  Otherwise if they're defined in an existing
> header file, you could just do "#ifndef UWOP_xxx / #define UWOP_xxx / #endif".
>
>> +      switch (dta[1]&0xf) {
>> +       if (((dta[1]>>4)&0xf) == 0)
>
>  Likewise I think accessor macros for the fields would be nice.  I know it's
> a pain but this code has to live forever and work everywhere, please let's be
> thorough.
>
>> +     case 1: /* UWOP_ALLOC_LARGE.  */
>> +       if (((dta[1]>>4)&0xf) == 0)
>> +         tmp = (bfd_vma) (*((unsigned short *)&dta[2]));
>> +       else
>> +         tmp = (bfd_vma) (*((unsigned int *)&dta[2]));
>> +       tmp *= 8;
>> +       fprintf (file, "save stack region of size 0x");
>
>  ?  That's not what I understood the algorithm to be;
>
>> UWOP_ALLOC_LARGE (1)2 or 3 nodes
>>
>> Allocate a large-sized area on the stack. There are two forms. If the
>> operation info equals 0, then the size of the allocation divided by 8 is
>> recorded in the next slot, allowing an allocation up to 512K – 8. If the
>> operation info equals 1, then the unscaled size of the allocation is
>> recorded in the next two slots in little-endian format, allowing
>> allocations up to 4GB – 8.
>
> so I think the "tmp *= 8" in both cases is incorrect, isn't it?  Only case 0
> should be multiplied by 8, case 1 is "unscaled"?

Right, thanks for notice. I'll change it.

>> +      /* Array of UNWIND_CODE with count_of_codes elements. This
>> +         this structure has byte size and the following definition:
>
>  This this comment has a repeated word!
>
>> +      /* if flag has bit 0 set, there is an exception hander.  */
>> +      bfd_vma exception_handler = 0;
>> +      /* if flag has bit 2 set, there is a function entry present.  */
>> +      bfd_vma function_entry = 0;
>> +      /* if flag has bit 0 set, there is an additionally exception data present.  */
>
>  These comments are unclear, omit leading capital letters, typo "hander",
> incorrect grammar "an additionally", and the two that both relate to bit 0
> should be merged.  How about:
>
>>> +      /*  If flag has bit 0 set, there is an exception handler
>>> +          and additional (language-specific) exception data
>>> +          present.  */
>>> +      bfd_vma exception_handler = 0;
>>> +      /*  If flag has bit 2 set, there is a function entry present.  */
>>> +      bfd_vma function_entry = 0;
>
> ... or similar?
>
>> +      if (!data) return;
>
>  Should be a separate line + indent for the return statement.
>
>> +      switch ((flags & 0x1f))
>> +        {
>> +          case 0:
>> +         fprintf (file, "none");
>> +         break;
>> +       case 1:
>
>  The "case 0" is misaligned, needs a TAB instead of leading eight spaces.
>
>> +      if ((flags & 1) != 0)
>> +        {
>> +       exception_handler = bfd_get_32 (abfd, data + addr);
>> +          addr += 4;
>> +        }
>> +      else if ((flags & 2) != 0)
>> +     {
>> +       exception_handler = bfd_get_32 (abfd, data + addr);
>> +          addr += 4;
>> +     }
>> +      else if ((flags & 4) != 0)
>> +        {
>> +       function_entry = bfd_get_32 (abfd, data + addr);
>> +       addr += 4; /* RUNTIME_FUNCTION * */
>> +        }
>
>  Also some wonky indentation here.  Needs reTABifying.  I already mentioned
> the hard-coded constants issue.
>
>> +# define PDATA_ROW_SIZE      (3 * 4)
>> +#undef PDATA_ROW_SIZE
>
>  I get that you're making it a local definition to the function, but I don't
> think that's necessary.  Why not just make it a file-scope #define at the top
> of the file alongside PEAOUTHDR?  It's not just unlikely to clash with
> anything that would mean anything to the coff-x86_64.c include, if anything it
> would be likely relevant to any other coff target that chose to implement
> *PDATA*-anything!
>
>> +static bfd_boolean
>> +_xx_bfd_print_pdata (bfd *abfd, void *vfile)
>
>> +#define bfd_pe_print_pdata   _xx_bfd_print_pdata
>
>  Needs renaming now it's not gonna get the auto-xx-substitution any more!
>
>  Apart from those issues, the basic shape and functionality of the patch
> looked right, but there could easily be typos I didn't spot among all the
> bit-twiddling and hard-coded constants; once you've done macros for them, any
> such errors will be either immediately obvious or obviously not there, so I
> really reckon it's worth the effort of respinning.
>
>    cheers,
>      DaveK
>
>
>

I'll rework this patch and add to the x64_64.h in coff the necessary
defines for it. I'll add the binary and explanded structures for it
there, too. So it can be a base for the implementation later, too.

The constants aren't present in standard header-sets. AFAIK some of
them are in ntddk. So I don't expect here any redefinition issues.

Cheers,
Kai
-- 
|  (\_/) This is Bunny. Copy and paste
| (='.'=) Bunny into your signature to help
| (")_(") him gain world domination



More information about the Binutils mailing list