This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC 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]

[Bug lto/81968] [8 regression] early lto debug objects make Solaris ld SEGV


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81968

--- Comment #31 from ro at CeBiTec dot Uni-Bielefeld.DE <ro at CeBiTec dot Uni-Bielefeld.DE> ---
I'm having a look at what's still going wrong with Eric's updated
patch.  On Solaris/SPARC, there are only two failures left:

FAIL: g++.dg/lto/pr51567-1 cp_lto_pr51567-1_0.o-cp_lto_pr51567-1_0.o link, 
-flto -g 

output is:
ld: warning: relocation error: R_SPARC_UA32: file /var/tmp//ccp39Xjadebugobj
section [8].debug_str: invalid offset symbol '.debug_str (section)': offset
0x2222
ld: warning: relocation error: R_SPARC_UA32: file /var/tmp//ccp39Xjadebugobj
section [8].debug_str: invalid offset symbol '.debug_str (section)': offset
0x2258

FAIL: g++.dg/lto/pr53470 cp_lto_pr53470_0.o-cp_lto_pr53470_0.o link,  -g -flto 

for both 32 and 64-bit.  Those are only warnings actually, but throw off
DejaGnu which doesn't expect linker output.

Investigating what's happending is unnecessarily hard right now because
even with -save-temps, a couple of the intermediate files are removed
and I needed to run the whole compilation under truss to see how they
are created.

Here's what I found for the g++.dg/lto/pr51567-1 case:

The linker warning happens during the final link step, which is
(omitting all paths to build directories)

 /usr/ccs/bin/ld -V -M  -Y P,/lib:/usr/lib -Qy -o g++-dg-lto-pr51567-1-01.exe
 /usr/lib/crt1.o crtp.o /usr/lib/crti.o /usr/lib/values-Xa.o
/usr/lib/values-xpg6.o  crtbegin.o
 cck5M.wddebugobj
 g++-dg-lto-pr51567-1-01.exe.ltrans0.ltrans.o -lstdc++ -lm
 -lrt -lgcc_s -lgcc -lc -lgcc_s -lgcc -lc
 crtend.o
 /usr/lib/crtn.o

cck5M.wddebugobj is created in several steps:

* lto-wrapper cp_lto_pr51567-1_0.o -> ccPhb7tcdebugobjtem

* ld -r -> cck5M.wddebugobj

and g++-dg-lto-pr51567-1-01.exe.ltrans0.ltrans.o is from

/usr/ccs/bin/as -V -Qy -s -xarch=v8plus -m32 -o
g++-dg-lto-pr51567-1-01.exe.ltrans0.ltrans.o
g++-dg-lto-pr51567-1-01.exe.ltrans0.s

-save-temps preserves the .s file, but not the object.

The ld warning above occurs (I believe) because the relocation offsets
are wrong: the .debug_str section is only 9 bytes long

Section Header[5]:  sh_name: .debug_str
    sh_addr:      0               sh_flags:   0
    sh_size:      0x9             sh_type:    [ SHT_PROGBITS ]
    sh_offset:    0x5c7           sh_entsize: 0
    sh_link:      0               sh_info:    0
    sh_addralign: 0x1       

but the offsets are way beyond that.

Relocation Section:  .rela.debug_str
  index  type          offset value addend  section    symbol
    [0]  R_SPARC_UA32   0x175     0      0  .debug_str .debug_str (section)
    [1]  R_SPARC_UA32   0x1ab     0      0  .debug_str .debug_str (section)
    [2]  R_SPARC_UA32     0x6     0      0  .debug_str .debug_abbrev (section)

The genesis of this section is especially strange:

* In the original object (pre lto-wrapper) there are

Section Header[5]:  sh_name: .gnu.debuglto_.debug_str
    sh_addr:      0               sh_flags:   0
    sh_size:      0x9             sh_type:    [ SHT_PROGBITS ]
    sh_offset:    0x671           sh_entsize: 0
    sh_link:      0               sh_info:    0
    sh_addralign: 0x1       

Section Header[24]:  sh_name: .debug_str
    sh_addr:      0               sh_flags:   0
    sh_size:      0x9             sh_type:    [ SHT_PROGBITS ]
    sh_offset:    0x1466          sh_entsize: 0
    sh_link:      0               sh_info:    0
    sh_addralign: 0x1       

  but no relocs for either section.  However I find

Relocation Section:  .rela.gnu.debuglto_.debug_info
  index  type             offset value addend  section / symbol
    [0]  R_SPARC_UA32        0x6     0      0  .gnu.debuglto_.debug_info
.gnu.debuglto_.debug_abbrev (section)
    [1]  R_SPARC_UA32      0x175     0      0  .gnu.debuglto_.debug_info
.gnu.debuglto_.debug_str (section)
    [2]  R_SPARC_UA32      0x1ab     0      0  .gnu.debuglto_.debug_info
.gnu.debuglto_.debug_str (section)

* After the lto-wrapper step, there's only .debug_str left

Section Header[3]:  sh_name: .debug_str
    sh_addr:      0               sh_flags:   0
    sh_size:      0x9             sh_type:    [ SHT_PROGBITS ]
    sh_offset:    0x485           sh_entsize: 0
    sh_link:      0               sh_info:    0
    sh_addralign: 0x1       

  but with the relocs relative to .debug_str

Relocation Section:  .rela.gnu.debuglto_.debug_info
  index  type          offset value addend  section    symbol
    [0]  R_SPARC_UA32     0x6     0      0  .debug_str .debug_abbrev (section)
    [1]  R_SPARC_UA32   0x175     0      0  .debug_str .debug_str (section)
    [2]  R_SPARC_UA32   0x1ab     0      0  .debug_str .debug_str (section)

* After ld -r, there's

Section Header[5]:  sh_name: .debug_str
    sh_addr:      0               sh_flags:   0
    sh_size:      0x9             sh_type:    [ SHT_PROGBITS ]
    sh_offset:    0x5c7           sh_entsize: 0
    sh_link:      0               sh_info:    0
    sh_addralign: 0x1       

Relocation Section:  .rela.debug_str
  index  type          offset value addend  section    symbol
    [0]  R_SPARC_UA32   0x175     0      0  .debug_str .debug_str (section)
    [1]  R_SPARC_UA32   0x1ab     0      0  .debug_str .debug_str (section)
    [2]  R_SPARC_UA32     0x6     0      0  .debug_str .debug_abbrev (section)

Something's very wrong here.

On Solaris/x86, there are similar errors, but also a couple of others
I'll be looking at next.

        Rainer

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