This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils 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]

Re: [PATCH/RFA] Fix C-referenceable sections with explicit LMAs


Hi Jason,

> Yes indeed.  Here is the patch for current Binutils, as well as a
> test case.  Test case fails without the patch, passes with, and no
> new regressions (tested on arm-netbsdelf).
> 
> OK for mainline?  OK for 2.13 branch?
> 
>       * ldexp.c (fold_name): Handle SIZEOF_UNADJ.  When handling
>       SIZEOF, apply any size adjustment that has been recorded
>       for the section.
>       * ldgram.y (SIZEOF_UNADJ): New token.
>       * ldlang.c (lang_output_section_statement_lookup): Initialize
>       size_adj and last_orphan members.
>       * ldlang.h (lang_output_section_statement_type): Add size_adj
>       and last_orphan members.
>       * emultempl/elf32.em (place_orphan): If no .rodata output section
>       is present, allow read-only data to be placed with .text.  If
>       the output section has an explicit LMA, compute an explicit LMA
>       for the orphan based on the LMA of the output section or the
>       previous orphan.  Record a size adjustment of the output section
>       for each orphan placed with it.
> 
>       * ld-scripts/refsec-lma.exp: New test.
>       * ld-scripts/refsec-lma.s: New test.
>       * ld-scripts/refsec-lma.t: New test.

Approved for the mainline.  I am not sure about the branch though -
lets wait a few days to see if the patch creates any problems first.

Before applying the patch though, please could you fix the following
issues:

> Index: ldexp.c

> +     case SIZEOF_UNADJ:              /* not actually allowed in grammar  */

Formatting of comment.

> Index: testsuite/ld-scripts/refsec-lma.exp

> + # This tests a feature found in the ELF back-end.
> + if { ![istarget *-*-sysv4*] \
> +      && ![istarget *-*-unixware*] \
> +      && ![istarget *-*-elf*] \
> +      && ![istarget *-*-eabi*] \
> +      && ![istarget hppa*64*-*-hpux*] \
> +      && ![istarget *-*-linux*] \
> +      && ![istarget *-*-netbsd*] \
> +      && ![istarget *-*-irix5*] \
> +      && ![istarget *-*-irix6*] \
> +      && ![istarget *-*-solaris2*] } {
> +     return
> + }
> +      
> + if { [istarget *-*-linux*aout*] \
> +      || [istarget *-*-linux*oldld*] } {
> +     return
> + }   

These tests can already be found in ld-lib.exp as proc is_elf_format.

> + if { ![istarget *-*-netbsdelf*] \
> +      && [[istarget *-*-netbsd*aout*] \
> +      || [istarget *-*-netbsdpe*] \
> +      || [istarget arm*-*-netbsd*] \
> +      || [istarget sparc-*-netbsd*] \
> +      || [istarget i*86-*-netbsd*] \
> +      || [istarget m68*-*-netbsd*] \
> +      || [istarget vax*-*-netbsd*] \
> +      || [istarget ns32k-*-netbsd*]] } {
> +     return
> + }

This does not work.  The double square brackets should be replace with
a round bracket and a square bracket, ie:

   if { ![istarget *-*-netbsdelf*] \
      && ([istarget *-*-netbsd*aout*] \
         || [istarget *-*-netbsdpe*] \
         || [istarget arm*-*-netbsd*] \
         || [istarget sparc-*-netbsd*] \
         || [istarget i*86-*-netbsd*] \
         || [istarget m68*-*-netbsd*] \
         || [istarget vax*-*-netbsd*] \
         || [istarget ns32k-*-netbsd*]) } {
     return
   }

Cheers
        Nick


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