brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.2 KiB · 5489208 Raw
628 lines · plain
1## Test how llvm-readobj/llvm-readelf tools handle invalid SHT_GNU_verneed sections.2 3## In the first case we have a SHT_GNU_versym section that refers to4## a version listed in a SHT_GNU_verneed section. That version has an5## empty name, making it invalid.6 7# RUN: yaml2obj --docnum=1 %s -o %t18# RUN: llvm-readelf -V %t1 | FileCheck %s --check-prefix=GNU-VERNEED-NAME9# RUN: llvm-readobj -V %t1 | FileCheck %s --check-prefix=LLVM-VERNEED-NAME10 11# GNU-VERNEED-NAME:      Version symbols section '.gnu.version' contains 2 entries:12# GNU-VERNEED-NAME-NEXT:  Addr: 0000000000200210  Offset: 0x000040  Link: 3 (.dynsym)13# GNU-VERNEED-NAME-NEXT:   000:   0 (*local*)       2 ()14 15# GNU-VERNEED-NAME:      Version needs section '.gnu.version_r' contains 1 entries:16# GNU-VERNEED-NAME-NEXT:  Addr: 0000000000200214  Offset: 0x000044  Link: 4 (.dynstr)17# GNU-VERNEED-NAME-NEXT:   0x0000: Version: 1  File: somefile  Cnt: 118# GNU-VERNEED-NAME-NEXT:   0x0010:   Name:   Flags: none  Version: 219 20# LLVM-VERNEED-NAME:      VersionSymbols [21# LLVM-VERNEED-NAME:        Symbol {22# LLVM-VERNEED-NAME-NEXT:     Version: 023# LLVM-VERNEED-NAME-NEXT:     Name:24# LLVM-VERNEED-NAME-NEXT:   }25# LLVM-VERNEED-NAME-NEXT:   Symbol {26# LLVM-VERNEED-NAME-NEXT:     Version: 227# LLVM-VERNEED-NAME-NEXT:     Name: foo28# LLVM-VERNEED-NAME-NEXT:   }29# LLVM-VERNEED-NAME-NEXT: ]30 31# LLVM-VERNEED-NAME:      VersionRequirements [32# LLVM-VERNEED-NAME-NEXT:   Dependency {33# LLVM-VERNEED-NAME-NEXT:     Version: 134# LLVM-VERNEED-NAME-NEXT:     Count: 135# LLVM-VERNEED-NAME-NEXT:     FileName: somefile36# LLVM-VERNEED-NAME-NEXT:     Entries [37# LLVM-VERNEED-NAME-NEXT:       Entry {38# LLVM-VERNEED-NAME-NEXT:         Hash:  039# LLVM-VERNEED-NAME-NEXT:         Flags [ (0x0)40# LLVM-VERNEED-NAME-NEXT:         ]41# LLVM-VERNEED-NAME-NEXT:         Index: 242# LLVM-VERNEED-NAME-NEXT:         Name: {{$}}43# LLVM-VERNEED-NAME-NEXT:       }44# LLVM-VERNEED-NAME-NEXT:     ]45# LLVM-VERNEED-NAME-NEXT:   }46# LLVM-VERNEED-NAME-NEXT: ]47 48--- !ELF49FileHeader:50  Class: ELFCLASS6451  Data:  ELFDATA2LSB52  Type:  ET_EXEC53Sections:54  - Name:    .gnu.version55    Type:    SHT_GNU_versym56    Flags:   [ SHF_ALLOC ]57    Address: 0x20021058    Entries: [ 0, 2 ]59  - Name:  .gnu.version_r60    Type:  SHT_GNU_verneed61    Flags: [ SHF_ALLOC ]62    AddressAlign: 463    Dependencies:64      - Version:   165        File:      somefile66        Entries:67          - Name:  '' ## invalid name68            Hash:  069            Flags: 070            Other: 271DynamicSymbols:72  - Name:    foo73    Binding: STB_GLOBAL74...75 76## In this case SHT_GNU_verneed is not linked to a dynamic string table. We check we handle77## this situation properly.78 79# RUN: yaml2obj --docnum=2 %s -o %t280# RUN: llvm-readelf -V %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=GNU-NOLINK81# RUN: llvm-readobj -V %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=LLVM-NOLINK82 83# GNU-NOLINK:      Version symbols section '.gnu.version' contains 2 entries:84# GNU-NOLINK-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 3 (.dynsym)85# GNU-NOLINK-NEXT: warning: '[[FILE]]': invalid string table linked to SHT_GNU_verneed section with index 2: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL86# GNU-NOLINK-NEXT:   000:   0 (*local*) 2 (<corrupt>)87# GNU-NOLINK:      Version needs section '.gnu.version_r' contains 1 entries:88# GNU-NOLINK-NEXT:  Addr: 0000000000000004  Offset: 0x000044  Link: 0 ()89# GNU-NOLINK-NEXT:   0x0000: Version: 1  File: <corrupt vn_file: 9>  Cnt: 190# GNU-NOLINK-NEXT:   0x0010:   Name: <corrupt>  Flags: none Version: 291 92# LLVM-NOLINK:      VersionSymbols [93# LLVM-NOLINK:        Symbol {94# LLVM-NOLINK-NEXT:     Version: 095# LLVM-NOLINK-NEXT:     Name:96# LLVM-NOLINK-NEXT:   }97# LLVM-NOLINK-NEXT:   Symbol {98# LLVM-NOLINK-NEXT:     Version: 299# LLVM-NOLINK-NEXT:  warning: '[[FILE]]': invalid string table linked to SHT_GNU_verneed section with index 2: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL100# LLVM-NOLINK-NEXT:     Name: foo@<corrupt>101# LLVM-NOLINK-NEXT:   }102# LLVM-NOLINK-NEXT: ]103 104# LLVM-NOLINK:      VersionRequirements [105# LLVM-NOLINK-NEXT:   Dependency {106# LLVM-NOLINK-NEXT:     Version: 1107# LLVM-NOLINK-NEXT:     Count: 1108# LLVM-NOLINK-NEXT:     FileName: <corrupt vn_file: 9>109# LLVM-NOLINK-NEXT:     Entries [110# LLVM-NOLINK-NEXT:       Entry {111# LLVM-NOLINK-NEXT:         Hash: 0112# LLVM-NOLINK-NEXT:         Flags [ (0x0)113# LLVM-NOLINK-NEXT:         ]114# LLVM-NOLINK-NEXT:         Index: 2115# LLVM-NOLINK-NEXT:         Name: <corrupt>116# LLVM-NOLINK-NEXT:       }117# LLVM-NOLINK-NEXT:     ]118# LLVM-NOLINK-NEXT:   }119# LLVM-NOLINK-NEXT: ]120 121--- !ELF122FileHeader:123  Class: ELFCLASS64124  Data:  ELFDATA2LSB125  Type:  ET_EXEC126Sections:127  - Name:    .gnu.version128    Type:    SHT_GNU_versym129    Flags:   [ SHF_ALLOC ]130    Entries: [ 0, 2 ]131  - Name:  .gnu.version_r132    Type:  SHT_GNU_verneed133    Flags: [ SHF_ALLOC ]134    Link:  0135    AddressAlign: 4136    Dependencies:137      - Version: 1138        File:    somefile139        Entries:140          - Name:  'bar'141            Hash:  0142            Flags: 0143            Other: 2144DynamicSymbols:145  - Name:    foo146    Binding: STB_GLOBAL147 148## We can't parse misaligned auxiliary version records.149 150# RUN: yaml2obj --docnum=3 %s -o %t3151# RUN: llvm-readelf -V %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=BROKEN-AUX-GNU152# RUN: llvm-readobj -V %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=BROKEN-AUX-LLVM153 154# BROKEN-AUX-GNU:      Version symbols section '.gnu.version' contains 1 entries:155# BROKEN-AUX-GNU-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 3 (.dynsym)156# BROKEN-AUX-GNU-NEXT: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 2: found a misaligned auxiliary entry at offset 0x11157# BROKEN-AUX-GNU-NEXT:  000:   2 (<corrupt>)158 159# BROKEN-AUX-LLVM:      VersionSymbols [160# BROKEN-AUX-LLVM-NEXT:   Symbol {161# BROKEN-AUX-LLVM-NEXT:     Version: 2162# BROKEN-AUX-LLVM-NEXT: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 2: found a misaligned auxiliary entry at offset 0x11163# BROKEN-AUX-LLVM-NEXT:     Name: @<corrupt>164# BROKEN-AUX-LLVM-NEXT:   }165# BROKEN-AUX-LLVM-NEXT: ]166 167--- !ELF168FileHeader:169  Class: ELFCLASS64170  Data:  ELFDATA2LSB171  Type:  ET_EXEC172Sections:173  - Name:    .gnu.version174    Type:    SHT_GNU_versym175    Flags:   [ SHF_ALLOC ]176    Entries: [ 2 ]177  - Name:         .gnu.version_r178    Type:         SHT_GNU_verneed179    Flags:        [ SHF_ALLOC ]180    Info:         1181    AddressAlign: 4182## The byte offset to the auxiliary entry is 0x11, i.e. it is not correctly aligned in memory.183    Content: "0100010001000000110000000000000000000000"184DynamicSymbols: []185 186## Here we check that we can properly dump the case when a dependency file name187## and/or a dependency name string offset is equal to the string table size.188##189## We set the version dependency vn_file field to the offset of string 'foo' in190## the .dynstr, which is 1. We create a custom string table .mystrtab of size 1191## and link it with the .gnu.version_r section. For the vna_name we use the same trick.192 193# RUN: yaml2obj --docnum=4 %s -o %t4194# RUN: llvm-readobj --sections --section-data -V %t4 | FileCheck %s --check-prefix=LLVM-OFFSET-EQ195# RUN: llvm-readelf --sections -V %t4 | FileCheck %s --check-prefix=GNU-OFFSET-EQ196 197# LLVM-OFFSET-EQ: Name: .mystrtab198# LLVM-OFFSET-EQ: Size:199# LLVM-OFFSET-EQ-SAME:  1200 201# LLVM-OFFSET-EQ:      Name: .dynstr202# LLVM-OFFSET-EQ:      SectionData (203# LLVM-OFFSET-EQ-NEXT:   0000: 00666F6F 00 |.foo.|204# LLVM-OFFSET-EQ-NEXT: )205 206# LLVM-OFFSET-EQ:      VersionRequirements [207# LLVM-OFFSET-EQ-NEXT:   Dependency {208# LLVM-OFFSET-EQ-NEXT:     Version: 1209# LLVM-OFFSET-EQ-NEXT:     Count: 1210# LLVM-OFFSET-EQ-NEXT:     FileName: <corrupt vn_file: 1>211# LLVM-OFFSET-EQ-NEXT:     Entries [212# LLVM-OFFSET-EQ-NEXT:       Entry {213# LLVM-OFFSET-EQ-NEXT:         Hash: 0214# LLVM-OFFSET-EQ-NEXT:         Flags [ (0x0)215# LLVM-OFFSET-EQ-NEXT:         ]216# LLVM-OFFSET-EQ-NEXT:         Index: 0217# LLVM-OFFSET-EQ-NEXT:         Name: <corrupt>218# LLVM-OFFSET-EQ-NEXT:       }219# LLVM-OFFSET-EQ-NEXT:     ]220# LLVM-OFFSET-EQ-NEXT:   }221# LLVM-OFFSET-EQ-NEXT: ]222 223# GNU-OFFSET-EQ:      Version needs section '.gnu.version_r' contains 1 entries:224# GNU-OFFSET-EQ-NEXT:  Addr: 0000000000000004  Offset: 0x000044  Link: 1 (.mystrtab)225# GNU-OFFSET-EQ-NEXT:   0x0000: Version: 1  File: <corrupt vn_file: 1>  Cnt: 1226# GNU-OFFSET-EQ-NEXT:   0x0010:   Name: <corrupt>  Flags: none  Version: 0227 228--- !ELF229FileHeader:230  Class: ELFCLASS64231  Data:  ELFDATA2LSB232  Type:  ET_EXEC233Sections:234  - Name: .mystrtab235    Type: SHT_STRTAB236    Content: "00"237  - Name:  .gnu.version_r238    Type:  SHT_GNU_verneed239    Flags: [ SHF_ALLOC ]240    Link:  .mystrtab241    AddressAlign: 4242    Dependencies:243      - Version: 1244        File:    foo245        Entries:246          - Name:  'foo'247            Hash:  0248            Flags: 0249            Other: 0250DynamicSymbols:251  - Name: foo252 253## Here we check that we can properly dump the case when a dependency file name254## and/or a dependency name string offset is greater than the string table size.255##256# RUN: yaml2obj --docnum=5 %s -o %t5257# RUN: llvm-readobj --sections -V %t5 | FileCheck %s --check-prefix=LLVM-OFFSET-GR258# RUN: llvm-readelf --sections -V %t5 | FileCheck %s --check-prefix=GNU-OFFSET-GR259 260# LLVM-OFFSET-GR:      VersionRequirements [261# LLVM-OFFSET-GR-NEXT:   Dependency {262# LLVM-OFFSET-GR-NEXT:     Version: 1263# LLVM-OFFSET-GR-NEXT:     Count: 1264# LLVM-OFFSET-GR-NEXT:     FileName: <corrupt vn_file: 1>265# LLVM-OFFSET-GR-NEXT:     Entries [266# LLVM-OFFSET-GR-NEXT:       Entry {267# LLVM-OFFSET-GR-NEXT:         Hash: 0268# LLVM-OFFSET-GR-NEXT:         Flags [ (0x0)269# LLVM-OFFSET-GR-NEXT:         ]270# LLVM-OFFSET-GR-NEXT:         Index: 0271# LLVM-OFFSET-GR-NEXT:         Name: <corrupt>272# LLVM-OFFSET-GR-NEXT:       }273# LLVM-OFFSET-GR-NEXT:     ]274# LLVM-OFFSET-GR-NEXT:   }275# LLVM-OFFSET-GR-NEXT: ]276 277# GNU-OFFSET-GR:      Version needs section '.gnu.version_r' contains 1 entries:278# GNU-OFFSET-GR-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 1 (.mystrtab)279# GNU-OFFSET-GR-NEXT:   0x0000: Version: 1  File: <corrupt vn_file: 1>  Cnt: 1280# GNU-OFFSET-GR-NEXT:   0x0010:   Name: <corrupt>  Flags: none  Version: 0281 282--- !ELF283FileHeader:284  Class: ELFCLASS64285  Data:  ELFDATA2LSB286  Type:  ET_EXEC287Sections:288  - Name: .mystrtab289    Type: SHT_STRTAB290    Content: ""291  - Name:  .gnu.version_r292    Type:  SHT_GNU_verneed293    Flags: [ SHF_ALLOC ]294    Link:  .mystrtab295    AddressAlign: 4296    Dependencies:297      - Version: 1298        File:    foo299        Entries:300          - Name:  'foo'301            Hash:  0302            Flags: 0303            Other: 0304DynamicSymbols:305  - Name: foo306 307## Check that we report a warning when sh_link references a non-existent section.308 309# RUN: yaml2obj --docnum=6 %s -DLINK=0xFF -o %t6310# RUN: llvm-readobj --sections -V %t6 2>&1 | FileCheck %s -DFILE=%t6 --implicit-check-not="warning:" --check-prefix=INVALID-LINK-LLVM311# RUN: llvm-readelf --sections -V %t6 2>&1 | FileCheck %s -DFILE=%t6 --implicit-check-not="warning:" --check-prefix=INVALID-LINK-GNU312 313# INVALID-LINK-LLVM:      VersionRequirements [314# INVALID-LINK-LLVM-NEXT:  warning: '[[FILE]]': invalid section linked to SHT_GNU_verneed section with index 1: invalid section index: 255315# INVALID-LINK-LLVM-NEXT:   Dependency {316# INVALID-LINK-LLVM-NEXT:     Version: 1317# INVALID-LINK-LLVM-NEXT:     Count: 1318# INVALID-LINK-LLVM-NEXT:     FileName: <corrupt vn_file: 1>319# INVALID-LINK-LLVM-NEXT:     Entries [320# INVALID-LINK-LLVM-NEXT:       Entry {321# INVALID-LINK-LLVM-NEXT:         Hash: 0322# INVALID-LINK-LLVM-NEXT:         Flags [ (0x0)323# INVALID-LINK-LLVM-NEXT:         ]324# INVALID-LINK-LLVM-NEXT:         Index: 0325# INVALID-LINK-LLVM-NEXT:         Name: <corrupt>326# INVALID-LINK-LLVM-NEXT:       }327# INVALID-LINK-LLVM-NEXT:     ]328# INVALID-LINK-LLVM-NEXT:   }329# INVALID-LINK-LLVM-NEXT: ]330 331# INVALID-LINK-GNU:      Version needs section '.gnu.version_r' contains 1 entries:332# INVALID-LINK-GNU-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_verneed section with index 1: invalid section index: 255333# INVALID-LINK-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 255 (<corrupt>)334# INVALID-LINK-GNU-NEXT:  0x0000: Version: 1 File: <corrupt vn_file: 1> Cnt: 1335# INVALID-LINK-GNU-NEXT:  0x0010: Name: <corrupt> Flags: none Version: 0336 337--- !ELF338FileHeader:339  Class: ELFCLASS64340  Data:  ELFDATA2LSB341  Type:  ET_EXEC342Sections:343  - Name:   .gnu.version_r344    Type:   SHT_GNU_verneed345    Flags:  [ SHF_ALLOC ]346    Link:   [[LINK=.dynstr]]347    ShName: [[SHNAME=<none>]]348    Dependencies:349      - Version: 1350        File:    foo351        Entries:352          - Name:  'foo'353            Hash:  0354            Flags: 0355            Other: 0356  - Name:   .dynstr357    Type:   SHT_STRTAB358    ShName: [[DYNSTRNAME=<none>]]359DynamicSymbols:360  - Name: foo361 362## Check that llvm-readelf reports a warning when the name of the SHT_GNU_verneed section can't be read.363 364# RUN: yaml2obj --docnum=6 %s -DSHNAME=0xFFFFFFFF -o %t.invalid.name365# RUN: llvm-readobj -V %t.invalid.name 2>&1 | \366# RUN:   FileCheck %s -DFILE=%t.invalid.name --check-prefix=INVALID-NAME-LLVM --implicit-check-not=warning:367# RUN: llvm-readelf -V %t.invalid.name 2>&1 | \368# RUN:   FileCheck %s -DFILE=%t.invalid.name --check-prefix=INVALID-NAME-GNU --implicit-check-not=warning:369 370# INVALID-NAME-LLVM:      VersionRequirements [371# INVALID-NAME-LLVM-NEXT:   Dependency {372# INVALID-NAME-LLVM-NEXT:     Version: 1373# INVALID-NAME-LLVM-NEXT:     Count: 1374# INVALID-NAME-LLVM-NEXT:     FileName: foo375# INVALID-NAME-LLVM-NEXT:     Entries [376# INVALID-NAME-LLVM-NEXT:       Entry {377# INVALID-NAME-LLVM-NEXT:         Hash: 0378# INVALID-NAME-LLVM-NEXT:         Flags [ (0x0)379# INVALID-NAME-LLVM-NEXT:         ]380# INVALID-NAME-LLVM-NEXT:         Index: 0381# INVALID-NAME-LLVM-NEXT:         Name: foo382# INVALID-NAME-LLVM-NEXT:       }383# INVALID-NAME-LLVM-NEXT:     ]384# INVALID-NAME-LLVM-NEXT:   }385# INVALID-NAME-LLVM-NEXT: ]386 387# INVALID-NAME-GNU:      warning: '[[FILE]]': unable to get the name of SHT_GNU_verneed section with index 1: a section [index 1] has an invalid sh_name (0xffffffff) offset which goes past the end of the section name string table388# INVALID-NAME-GNU-NEXT: Version needs section '<?>' contains 1 entries:389# INVALID-NAME-GNU-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 2 (.dynstr)390# INVALID-NAME-GNU-NEXT:   0x0000: Version: 1  File: foo  Cnt: 1391# INVALID-NAME-GNU-NEXT:   0x0010:   Name: foo  Flags: none  Version: 0392 393## Check that llvm-readelf reports a warning when we are unable to read the name of394## the section linked with the SHT_GNU_verneed section (usually ".dynstr").395 396# RUN: yaml2obj --docnum=6 %s -DDYNSTRNAME=0xFFFFFFFF -o %t.invalid.name2397# RUN: llvm-readobj -V %t.invalid.name2 2>&1 | \398# RUN:   FileCheck %s -DFILE=%t.invalid.name2 --check-prefix=INVALID-NAME-LLVM --implicit-check-not=warning:399# RUN: llvm-readelf -V %t.invalid.name2 2>&1 | \400# RUN:   FileCheck %s -DFILE=%t.invalid.name2 --check-prefix=INVALID-NAME2-GNU --implicit-check-not=warning:401 402# INVALID-NAME2-GNU:      Version needs section '.gnu.version_r' contains 1 entries:403# INVALID-NAME2-GNU-NEXT: warning: '[[FILE]]': unable to get the name of SHT_STRTAB section with index 2: a section [index 2] has an invalid sh_name (0xffffffff) offset which goes past the end of the section name string table404# INVALID-NAME2-GNU-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 2 (<?>)405# INVALID-NAME2-GNU-NEXT:   0x0000: Version: 1  File: foo  Cnt: 1406# INVALID-NAME2-GNU-NEXT:   0x0010:   Name: foo  Flags: none  Version: 0407 408## Check that we report a warning when we can't read the content of the SHT_GNU_verneed section.409 410# RUN: yaml2obj --docnum=7 %s -o %t7411# RUN: llvm-readobj --sections -V %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DATA412# RUN: llvm-readelf --sections -V %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DATA413 414# INVALID-DATA: warning: '[[FILE]]': cannot read content of SHT_GNU_verneed section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x0) that is greater than the file size (0x228)415 416--- !ELF417FileHeader:418  Class: ELFCLASS64419  Data:  ELFDATA2LSB420  Type:  ET_EXEC421Sections:422  - Name:     .gnu.version_r423    Type:     SHT_GNU_verneed424    Flags:    [ SHF_ALLOC ]425    ShOffset: 0xFFFFFFFF426## Triggers creation of the .dynstr.427DynamicSymbols:428  - Name: foo429 430## Check that we report a warning when a SHT_GNU_verneed section contains a version dependency431## that goes past the end of the section.432 433# RUN: yaml2obj --docnum=8 %s -o %t8434# RUN: llvm-readobj --sections -V %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=DEP-PAST-END435# RUN: llvm-readelf --sections -V %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=DEP-PAST-END436 437# DEP-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: version dependency 1 goes past the end of the section438 439--- !ELF440FileHeader:441  Class: ELFCLASS64442  Data:  ELFDATA2LSB443  Type:  ET_EXEC444Sections:445  - Name:   .gnu.version_r446    Type:   SHT_GNU_verneed447    Flags:  [ SHF_ALLOC ]448    ShSize: 0x1449    Dependencies:450      - Version: 1451        File:    foo452        Entries:453          - Name:  'foo'454            Hash:  0455            Flags: 0456            Other: 0457DynamicSymbols:458  - Name: foo459 460## Check we report a warning when a version dependency is not correctly aligned in memory.461 462# RUN: yaml2obj --docnum=9 %s -o %t9463# RUN: llvm-readobj --sections -V %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=MISALIGNED-DEP464# RUN: llvm-readelf --sections -V %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=MISALIGNED-DEP465 466# MISALIGNED-DEP: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: found a misaligned version dependency entry at offset 0x0467 468--- !ELF469FileHeader:470  Class: ELFCLASS64471  Data:  ELFDATA2LSB472  Type:  ET_EXEC473Sections:474  - Type: Fill475    Size: 0x1476  - Name:  .gnu.version_r477    Type:  SHT_GNU_verneed478    Flags: [ SHF_ALLOC ]479    Link:  .dynstr480    Dependencies:481      - Version: 1482        File:    foo483        Entries:484          - Name:  'foo'485            Hash:  0486            Flags: 0487            Other: 0488DynamicSymbols:489  - Name: foo490 491## Check that we report a warning when a SHT_GNU_verneed section contains a dependency definition492## that refers to an auxiliary entry that goes past the end of the section.493 494# RUN: yaml2obj --docnum=10 %s -o %t10495# RUN: llvm-readobj --sections -V %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=AUX-PAST-END496# RUN: llvm-readelf --sections -V %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=AUX-PAST-END497 498# AUX-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: version dependency 1 refers to an auxiliary entry that goes past the end of the section499 500--- !ELF501FileHeader:502  Class: ELFCLASS64503  Data:  ELFDATA2LSB504  Type:  ET_EXEC505Sections:506  - Name:   .gnu.version_r507    Type:   SHT_GNU_verneed508    Flags:  [ SHF_ALLOC ]509    ShSize: 21510    Dependencies:511      - Version: 1512        File:    foo513        Entries:514          - Name:  'foo'515            Hash:  0516            Flags: 0517            Other: 0518DynamicSymbols:519  - Name: foo520 521## Check we report a warning when an auxiliary entry is not correctly aligned in memory.522 523# RUN: yaml2obj %s --docnum=11 -o %t11524# RUN: llvm-readobj -V %t11 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t11525# RUN: llvm-readelf -V %t11 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t11526 527# MISALIGNED-AUX: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: found a misaligned auxiliary entry at offset 0x11528 529--- !ELF530FileHeader:531  Class: ELFCLASS64532  Data:  ELFDATA2LSB533  Type:  ET_EXEC534Sections:535  - Name:  .gnu.version_r536    Type:  SHT_GNU_verneed537    Flags: [ SHF_ALLOC ]538    Info:  1539## The byte offset to the auxiliary entry is 0x11, i.e. it is not correctly aligned in memory.540    Content: "0100010001000000110000000000000000000000"541DynamicSymbols:542  - Name: foo543 544## Check how we handle the case when a dependency definition entry has an unsupported version.545 546# RUN: yaml2obj %s --docnum=12 -o %t12547# RUN: llvm-readobj -V %t12 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t12548# RUN: llvm-readelf -V %t12 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t12549 550# UNSUPPORTED-VERSION: warning: '[[FILE]]': unable to dump SHT_GNU_verneed section with index 1: version 65278 is not yet supported551 552--- !ELF553FileHeader:554  Class: ELFCLASS64555  Data:  ELFDATA2LSB556  Type:  ET_EXEC557Sections:558  - Name:  .gnu.version_r559    Type:  SHT_GNU_verneed560    Flags: [ SHF_ALLOC ]561    Dependencies:562      - Version: 0xfefe563        File:    foo564        Entries:565          - Name:  'foo'566            Hash:  0567            Flags: 0568            Other: 0569DynamicSymbols:570  - Name: foo571 572## In this case SHT_GNU_verneed is linked to a custom dynamic string table, which is not573## called ".dynstr". Check we handle this case properly.574 575# RUN: yaml2obj --docnum=13 %s -o %t13576# RUN: llvm-readelf -V %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=GNU-CUSTOM-DYNSTR577# RUN: llvm-readobj -V %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=LLVM-CUSTOM-DYNSTR578 579# GNU-CUSTOM-DYNSTR:      Version symbols section '.gnu.version' contains 2 entries:580# GNU-CUSTOM-DYNSTR-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 4 (.dynsym)581# GNU-CUSTOM-DYNSTR-NEXT:   000:   0 (*local*)       2 (bcdefghij)582# GNU-CUSTOM-DYNSTR:      Version needs section '.gnu.version_r' contains 1 entries:583# GNU-CUSTOM-DYNSTR-NEXT:  Addr: 0000000000000004  Offset: 0x000044  Link: 3 (.custom.dynstr)584# GNU-CUSTOM-DYNSTR-NEXT:   0x0000: Version: 1  File: j  Cnt: 1585# GNU-CUSTOM-DYNSTR-NEXT:   0x0010:   Name: bcdefghij  Flags: none  Version: 2586 587# LLVM-CUSTOM-DYNSTR:      VersionSymbols [588# LLVM-CUSTOM-DYNSTR:      Symbol {589# LLVM-CUSTOM-DYNSTR:        Version: 2590# LLVM-CUSTOM-DYNSTR-NEXT:   Name: foo@bcdefghij591 592# LLVM-CUSTOM-DYNSTR:      VersionRequirements [593# LLVM-CUSTOM-DYNSTR:        Dependency {594# LLVM-CUSTOM-DYNSTR:          Entries [595# LLVM-CUSTOM-DYNSTR:            Entry {596# LLVM-CUSTOM-DYNSTR:              Index: 2597# LLVM-CUSTOM-DYNSTR-NEXT:          Name: bcdefghij598 599--- !ELF600FileHeader:601  Class: ELFCLASS64602  Data:  ELFDATA2LSB603  Type:  ET_EXEC604Sections:605  - Name:    .gnu.version606    Type:    SHT_GNU_versym607    Flags:   [ SHF_ALLOC ]608    Entries: [ 0, 2 ]609  - Name:  .gnu.version_r610    Type:  SHT_GNU_verneed611    Flags: [ SHF_ALLOC ]612    Link:  .custom.dynstr613    AddressAlign: 4614    Dependencies:615      - Version: 1616        File:    zed617        Entries:618          - Name:  'bar'619            Hash:  0620            Flags: 0621            Other: 2622  - Name: .custom.dynstr623    Type: SHT_STRTAB624    Content: "6162636465666768696a00" ## 'a','b','c','d','e','f','g','h','i','j',NIL625DynamicSymbols:626  - Name:    foo627    Binding: STB_GLOBAL628