debug/elf: adjust version API per issue discussion

This updates the new version API for the discussion on #63952.

This change reveals that in fact none of the tests set the
VERSYM_HIDDEN bit. The code before this CL set the hidden flag
for symbols that appear in DynamicVersionNeed, but that is not
an accurate representation of the ELF. The readelf program
does print undefined symbols that way (with a single '@'),
but that doesn't mean that the hidden flag is set.
Leaving tests with the hidden bit set for later.

For #63952

Change-Id: Ida60831e0c9922dfc10f10c7a64bc76a2b197537
Reviewed-on: https://go-review.googlesource.com/c/go/+/635079
Reviewed-by: Austin Clements <austin@google.com>
Commit-Queue: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
This commit is contained in:
Ian Lance Taylor 2024-12-10 19:48:11 -08:00 committed by Gopher Robot
parent c93477b5e5
commit 0ca521f9c1
4 changed files with 440 additions and 391 deletions

View File

@ -106,33 +106,34 @@ pkg debug/elf, const VER_FLG_INFO = 4 #63952
pkg debug/elf, const VER_FLG_INFO DynamicVersionFlag #63952 pkg debug/elf, const VER_FLG_INFO DynamicVersionFlag #63952
pkg debug/elf, const VER_FLG_WEAK = 2 #63952 pkg debug/elf, const VER_FLG_WEAK = 2 #63952
pkg debug/elf, const VER_FLG_WEAK DynamicVersionFlag #63952 pkg debug/elf, const VER_FLG_WEAK DynamicVersionFlag #63952
pkg debug/elf, const VerFlagGlobal = 2 #63952 pkg debug/elf, const VersionScopeGlobal = 2 #63952
pkg debug/elf, const VerFlagGlobal SymbolVersionFlag #63952 pkg debug/elf, const VersionScopeGlobal SymbolVersionScope #63952
pkg debug/elf, const VerFlagHidden = 4 #63952 pkg debug/elf, const VersionScopeHidden = 4 #63952
pkg debug/elf, const VerFlagHidden SymbolVersionFlag #63952 pkg debug/elf, const VersionScopeHidden SymbolVersionScope #63952
pkg debug/elf, const VerFlagLocal = 1 #63952 pkg debug/elf, const VersionScopeLocal = 1 #63952
pkg debug/elf, const VerFlagLocal SymbolVersionFlag #63952 pkg debug/elf, const VersionScopeLocal SymbolVersionScope #63952
pkg debug/elf, const VerFlagNone = 0 #63952 pkg debug/elf, const VersionScopeNone = 0 #63952
pkg debug/elf, const VerFlagNone SymbolVersionFlag #63952 pkg debug/elf, const VersionScopeNone SymbolVersionScope #63952
pkg debug/elf, const VersionScopeSpecific = 3 #63952
pkg debug/elf, const VersionScopeSpecific SymbolVersionScope #63952
pkg debug/elf, method (*File) DynamicVersionNeeds() ([]DynamicVersionNeed, error) #63952 pkg debug/elf, method (*File) DynamicVersionNeeds() ([]DynamicVersionNeed, error) #63952
pkg debug/elf, method (*File) DynamicVersions() ([]DynamicVersion, error) #63952 pkg debug/elf, method (*File) DynamicVersions() ([]DynamicVersion, error) #63952
pkg debug/elf, type DynamicVersion struct #63952 pkg debug/elf, type DynamicVersion struct #63952
pkg debug/elf, type DynamicVersion struct, Deps []string #63952 pkg debug/elf, type DynamicVersion struct, Deps []string #63952
pkg debug/elf, type DynamicVersion struct, Flags DynamicVersionFlag #63952 pkg debug/elf, type DynamicVersion struct, Flags DynamicVersionFlag #63952
pkg debug/elf, type DynamicVersion struct, Name string #63952
pkg debug/elf, type DynamicVersion struct, Index uint16 #63952 pkg debug/elf, type DynamicVersion struct, Index uint16 #63952
pkg debug/elf, type DynamicVersion struct, Version uint16 #63952
pkg debug/elf, type DynamicVersionDep struct #63952 pkg debug/elf, type DynamicVersionDep struct #63952
pkg debug/elf, type DynamicVersionDep struct, Dep string #63952 pkg debug/elf, type DynamicVersionDep struct, Dep string #63952
pkg debug/elf, type DynamicVersionDep struct, Flags DynamicVersionFlag #63952 pkg debug/elf, type DynamicVersionDep struct, Flags DynamicVersionFlag #63952
pkg debug/elf, type DynamicVersionDep struct, Other uint16 #63952 pkg debug/elf, type DynamicVersionDep struct, Index uint16 #63952
pkg debug/elf, type DynamicVersionFlag uint16 #63952 pkg debug/elf, type DynamicVersionFlag uint16 #63952
pkg debug/elf, type DynamicVersionNeed struct #63952 pkg debug/elf, type DynamicVersionNeed struct #63952
pkg debug/elf, type DynamicVersionNeed struct, Name string #63952 pkg debug/elf, type DynamicVersionNeed struct, Name string #63952
pkg debug/elf, type DynamicVersionNeed struct, Needs []DynamicVersionDep #63952 pkg debug/elf, type DynamicVersionNeed struct, Needs []DynamicVersionDep #63952
pkg debug/elf, type DynamicVersionNeed struct, Version uint16 #63952 pkg debug/elf, type Symbol struct, VersionScope SymbolVersionScope #63952
pkg debug/elf, type Symbol struct, VersionFlags SymbolVersionFlag #63952
pkg debug/elf, type Symbol struct, VersionIndex int16 #63952 pkg debug/elf, type Symbol struct, VersionIndex int16 #63952
pkg debug/elf, type SymbolVersionFlag uint8 #63952 pkg debug/elf, type SymbolVersionScope uint8 #63952
pkg encoding, type BinaryAppender interface { AppendBinary } #62384 pkg encoding, type BinaryAppender interface { AppendBinary } #62384
pkg encoding, type BinaryAppender interface, AppendBinary([]uint8) ([]uint8, error) #62384 pkg encoding, type BinaryAppender interface, AppendBinary([]uint8) ([]uint8, error) #62384
pkg encoding, type TextAppender interface { AppendText } #62384 pkg encoding, type TextAppender interface { AppendText } #62384

View File

@ -209,10 +209,22 @@ type Symbol struct {
Name string Name string
Info, Other byte Info, Other byte
// These fields are used for symbol versioning // VersionScope describes the version in which the symbol is defined.
// and are present only for the dynamic symbol table. // This is only set for the dynamic symbol table.
// When no symbol versioning information is available,
// this is VersionScopeNone.
VersionScope SymbolVersionScope
// VersionIndex is the version index.
// This is only set if VersionScope is VersionScopeSpecific or
// VersionScopeHidden. This is only set for the dynamic symbol table.
// This index will match either [DynamicVersion.Index]
// in the slice returned by [File.DynamicVersions],
// or [DynamicVersiondep.Index] in the Needs field
// of the elements of the slice returned by [File.DynamicVersionNeeds].
// In general, a defined symbol will have an index referring
// to DynamicVersions, and an undefined symbol will have an index
// referring to some version in DynamicVersionNeeds.
VersionIndex int16 VersionIndex int16
VersionFlags SymbolVersionFlag
Section SectionIndex Section SectionIndex
Value, Size uint64 Value, Size uint64
@ -1455,9 +1467,13 @@ func (f *File) DynamicSymbols() ([]Symbol, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
if f.gnuVersionInit(str) { hasVersions, err := f.gnuVersionInit(str)
if err != nil {
return nil, err
}
if hasVersions {
for i := range sym { for i := range sym {
sym[i].VersionIndex, sym[i].Version, sym[i].Library, sym[i].VersionFlags = f.gnuVersion(i) sym[i].VersionIndex, sym[i].Version, sym[i].Library, sym[i].VersionScope = f.gnuVersion(i)
} }
} }
return sym, nil return sym, nil
@ -1478,7 +1494,9 @@ func (f *File) ImportedSymbols() ([]ImportedSymbol, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
f.gnuVersionInit(str) if _, err := f.gnuVersionInit(str); err != nil {
return nil, err
}
var all []ImportedSymbol var all []ImportedSymbol
for i, s := range sym { for i, s := range sym {
if ST_BIND(s.Info) == STB_GLOBAL && s.Section == SHN_UNDEF { if ST_BIND(s.Info) == STB_GLOBAL && s.Section == SHN_UNDEF {
@ -1490,46 +1508,57 @@ func (f *File) ImportedSymbols() ([]ImportedSymbol, error) {
return all, nil return all, nil
} }
type SymbolVersionFlag byte // SymbolVersionScope describes the version in which a [Symbol] is defined.
// This is only used for the dynamic symbol table.
type SymbolVersionScope byte
const ( const (
VerFlagNone SymbolVersionFlag = 0x0 // No flags. VersionScopeNone SymbolVersionScope = iota // no symbol version available
VerFlagLocal SymbolVersionFlag = 0x1 // Symbol has local scope. VersionScopeLocal // symbol has local scope
VerFlagGlobal SymbolVersionFlag = 0x2 // Symbol has global scope. VersionScopeGlobal // symbol has global scope and is in the base version
VerFlagHidden SymbolVersionFlag = 0x4 // Symbol is hidden. VersionScopeSpecific // symbol has global scope and is in the version given by VersionIndex
VersionScopeHidden // symbol is in the version given by VersionIndex, and is hidden
) )
// DynamicVersion is a version defined by a dynamic object. // DynamicVersion is a version defined by a dynamic object.
// This describes entries in the ELF SHT_GNU_verdef section.
// We assume that the vd_version field is 1.
// Note that the name of the version appears here;
// it is not in the first Deps entry as it is in the ELF file.
type DynamicVersion struct { type DynamicVersion struct {
Version uint16 // Version of data structure. Name string // Name of version defined by this index.
Flags DynamicVersionFlag
Index uint16 // Version index. Index uint16 // Version index.
Deps []string // Dependencies. Flags DynamicVersionFlag
Deps []string // Names of versions that this version depends upon.
} }
// DynamicVersionNeed describes a shared library needed by a dynamic object,
// with a list of the versions needed from that shared library.
// This describes entries in the ELF SHT_GNU_verneed section.
// We assume that the vn_version field is 1.
type DynamicVersionNeed struct { type DynamicVersionNeed struct {
Version uint16 // Version of data structure.
Name string // Shared library name. Name string // Shared library name.
Needs []DynamicVersionDep // Dependencies. Needs []DynamicVersionDep // Dependencies.
} }
// DynamicVersionDep is a version needed from some shared library.
type DynamicVersionDep struct { type DynamicVersionDep struct {
Flags DynamicVersionFlag Flags DynamicVersionFlag
Other uint16 // Version index. Index uint16 // Version index.
Dep string // Name of required version. Dep string // Name of required version.
} }
// dynamicVersions returns version information for a dynamic object. // dynamicVersions returns version information for a dynamic object.
func (f *File) dynamicVersions(str []byte) bool { func (f *File) dynamicVersions(str []byte) error {
if f.dynVers != nil { if f.dynVers != nil {
// Already initialized. // Already initialized.
return true return nil
} }
// Accumulate verdef information. // Accumulate verdef information.
vd := f.SectionByType(SHT_GNU_VERDEF) vd := f.SectionByType(SHT_GNU_VERDEF)
if vd == nil { if vd == nil {
return false return nil
} }
d, _ := vd.Data() d, _ := vd.Data()
@ -1540,12 +1569,20 @@ func (f *File) dynamicVersions(str []byte) bool {
break break
} }
version := f.ByteOrder.Uint16(d[i : i+2]) version := f.ByteOrder.Uint16(d[i : i+2])
if version != 1 {
return &FormatError{int64(vd.Offset + uint64(i)), "unexpected dynamic version", version}
}
flags := DynamicVersionFlag(f.ByteOrder.Uint16(d[i+2 : i+4])) flags := DynamicVersionFlag(f.ByteOrder.Uint16(d[i+2 : i+4]))
ndx := f.ByteOrder.Uint16(d[i+4 : i+6]) ndx := f.ByteOrder.Uint16(d[i+4 : i+6])
cnt := f.ByteOrder.Uint16(d[i+6 : i+8]) cnt := f.ByteOrder.Uint16(d[i+6 : i+8])
aux := f.ByteOrder.Uint32(d[i+12 : i+16]) aux := f.ByteOrder.Uint32(d[i+12 : i+16])
next := f.ByteOrder.Uint32(d[i+16 : i+20]) next := f.ByteOrder.Uint32(d[i+16 : i+20])
if cnt == 0 {
return &FormatError{int64(vd.Offset + uint64(i)), "dynamic version has no name", nil}
}
var name string
var depName string var depName string
var deps []string var deps []string
j := i + int(aux) j := i + int(aux)
@ -1557,15 +1594,19 @@ func (f *File) dynamicVersions(str []byte) bool {
vnext := f.ByteOrder.Uint32(d[j+4 : j+8]) vnext := f.ByteOrder.Uint32(d[j+4 : j+8])
depName, _ = getString(str, int(vname)) depName, _ = getString(str, int(vname))
if c == 0 {
name = depName
} else {
deps = append(deps, depName) deps = append(deps, depName)
}
j += int(vnext) j += int(vnext)
} }
dynVers = append(dynVers, DynamicVersion{ dynVers = append(dynVers, DynamicVersion{
Version: version, Name: name,
Flags: flags,
Index: ndx, Index: ndx,
Flags: flags,
Deps: deps, Deps: deps,
}) })
@ -1577,7 +1618,7 @@ func (f *File) dynamicVersions(str []byte) bool {
f.dynVers = dynVers f.dynVers = dynVers
return true return nil
} }
// DynamicVersions returns version information for a dynamic object. // DynamicVersions returns version information for a dynamic object.
@ -1587,7 +1628,11 @@ func (f *File) DynamicVersions() ([]DynamicVersion, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
if !f.gnuVersionInit(str) { hasVersions, err := f.gnuVersionInit(str)
if err != nil {
return nil, err
}
if !hasVersions {
return nil, errors.New("DynamicVersions: missing version table") return nil, errors.New("DynamicVersions: missing version table")
} }
} }
@ -1596,16 +1641,16 @@ func (f *File) DynamicVersions() ([]DynamicVersion, error) {
} }
// dynamicVersionNeeds returns version dependencies for a dynamic object. // dynamicVersionNeeds returns version dependencies for a dynamic object.
func (f *File) dynamicVersionNeeds(str []byte) bool { func (f *File) dynamicVersionNeeds(str []byte) error {
if f.dynVerNeeds != nil { if f.dynVerNeeds != nil {
// Already initialized. // Already initialized.
return true return nil
} }
// Accumulate verneed information. // Accumulate verneed information.
vn := f.SectionByType(SHT_GNU_VERNEED) vn := f.SectionByType(SHT_GNU_VERNEED)
if vn == nil { if vn == nil {
return false return nil
} }
d, _ := vn.Data() d, _ := vn.Data()
@ -1617,7 +1662,7 @@ func (f *File) dynamicVersionNeeds(str []byte) bool {
} }
vers := f.ByteOrder.Uint16(d[i : i+2]) vers := f.ByteOrder.Uint16(d[i : i+2])
if vers != 1 { if vers != 1 {
break return &FormatError{int64(vn.Offset + uint64(i)), "unexpected dynamic need version", vers}
} }
cnt := f.ByteOrder.Uint16(d[i+2 : i+4]) cnt := f.ByteOrder.Uint16(d[i+2 : i+4])
fileoff := f.ByteOrder.Uint32(d[i+4 : i+8]) fileoff := f.ByteOrder.Uint32(d[i+4 : i+8])
@ -1632,14 +1677,14 @@ func (f *File) dynamicVersionNeeds(str []byte) bool {
break break
} }
flags := DynamicVersionFlag(f.ByteOrder.Uint16(d[j+4 : j+6])) flags := DynamicVersionFlag(f.ByteOrder.Uint16(d[j+4 : j+6]))
other := f.ByteOrder.Uint16(d[j+6 : j+8]) index := f.ByteOrder.Uint16(d[j+6 : j+8])
nameoff := f.ByteOrder.Uint32(d[j+8 : j+12]) nameoff := f.ByteOrder.Uint32(d[j+8 : j+12])
next := f.ByteOrder.Uint32(d[j+12 : j+16]) next := f.ByteOrder.Uint32(d[j+12 : j+16])
depName, _ := getString(str, int(nameoff)) depName, _ := getString(str, int(nameoff))
deps = append(deps, DynamicVersionDep{ deps = append(deps, DynamicVersionDep{
Flags: flags, Flags: flags,
Other: other, Index: index,
Dep: depName, Dep: depName,
}) })
@ -1650,7 +1695,6 @@ func (f *File) dynamicVersionNeeds(str []byte) bool {
} }
dynVerNeeds = append(dynVerNeeds, DynamicVersionNeed{ dynVerNeeds = append(dynVerNeeds, DynamicVersionNeed{
Version: vers,
Name: file, Name: file,
Needs: deps, Needs: deps,
}) })
@ -1663,7 +1707,7 @@ func (f *File) dynamicVersionNeeds(str []byte) bool {
f.dynVerNeeds = dynVerNeeds f.dynVerNeeds = dynVerNeeds
return true return nil
} }
// DynamicVersionNeeds returns version dependencies for a dynamic object. // DynamicVersionNeeds returns version dependencies for a dynamic object.
@ -1673,7 +1717,11 @@ func (f *File) DynamicVersionNeeds() ([]DynamicVersionNeed, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
if !f.gnuVersionInit(str) { hasVersions, err := f.gnuVersionInit(str)
if err != nil {
return nil, err
}
if !hasVersions {
return nil, errors.New("DynamicVersionNeeds: missing version table") return nil, errors.New("DynamicVersionNeeds: missing version table")
} }
} }
@ -1683,66 +1731,66 @@ func (f *File) DynamicVersionNeeds() ([]DynamicVersionNeed, error) {
// gnuVersionInit parses the GNU version tables // gnuVersionInit parses the GNU version tables
// for use by calls to gnuVersion. // for use by calls to gnuVersion.
func (f *File) gnuVersionInit(str []byte) bool { // It reports whether any version tables were found.
func (f *File) gnuVersionInit(str []byte) (bool, error) {
// Versym parallels symbol table, indexing into verneed. // Versym parallels symbol table, indexing into verneed.
vs := f.SectionByType(SHT_GNU_VERSYM) vs := f.SectionByType(SHT_GNU_VERSYM)
if vs == nil { if vs == nil {
return false return false, nil
} }
d, _ := vs.Data() d, _ := vs.Data()
f.gnuVersym = d f.gnuVersym = d
f.dynamicVersions(str) if err := f.dynamicVersions(str); err != nil {
f.dynamicVersionNeeds(str) return false, err
return true }
if err := f.dynamicVersionNeeds(str); err != nil {
return false, err
}
return true, nil
} }
// gnuVersion adds Library and Version information to sym, // gnuVersion adds Library and Version information to sym,
// which came from offset i of the symbol table. // which came from offset i of the symbol table.
func (f *File) gnuVersion(i int) (versionIndex int16, version string, library string, versionFlags SymbolVersionFlag) { func (f *File) gnuVersion(i int) (versionIndex int16, version string, library string, versionFlags SymbolVersionScope) {
// Each entry is two bytes; skip undef entry at beginning. // Each entry is two bytes; skip undef entry at beginning.
i = (i + 1) * 2 i = (i + 1) * 2
if i >= len(f.gnuVersym) { if i >= len(f.gnuVersym) {
return -1, "", "", VerFlagNone return -1, "", "", VersionScopeNone
} }
s := f.gnuVersym[i:] s := f.gnuVersym[i:]
if len(s) < 2 { if len(s) < 2 {
return -1, "", "", VerFlagNone return -1, "", "", VersionScopeNone
} }
j := int32(f.ByteOrder.Uint16(s)) j := int32(f.ByteOrder.Uint16(s))
var ndx = int16(j & 0x7fff) ndx := int16(j & 0x7fff)
if ndx == 0 { if j == 0 {
return ndx, "", "", VerFlagLocal return ndx, "", "", VersionScopeLocal
} else if ndx == 1 { } else if j == 1 {
return ndx, "", "", VerFlagGlobal return ndx, "", "", VersionScopeGlobal
} }
if ndx < 2 { scope := VersionScopeSpecific
return 0, "", "", VerFlagNone if j&0x8000 != 0 {
scope = VersionScopeHidden
} }
for _, v := range f.dynVerNeeds { for _, v := range f.dynVerNeeds {
for _, n := range v.Needs { for _, n := range v.Needs {
if uint16(ndx) == n.Other { if uint16(ndx) == n.Index {
return ndx, n.Dep, v.Name, VerFlagHidden return ndx, n.Dep, v.Name, scope
} }
} }
} }
for _, v := range f.dynVers { for _, v := range f.dynVers {
if uint16(ndx) == v.Index { if uint16(ndx) == v.Index {
if len(v.Deps) > 0 { return ndx, v.Name, "", scope
flags := VerFlagNone
if j&0x8000 != 0 {
flags = VerFlagHidden
}
return ndx, v.Deps[0], "", flags
}
} }
} }
return -1, "", "", VerFlagNone return -1, "", "", VersionScopeNone
} }
// ImportedLibraries returns the names of all libraries // ImportedLibraries returns the names of all libraries

View File

@ -78,80 +78,80 @@ var fileTests = []fileTest{
}, },
[]string{"libc.so.6"}, []string{"libc.so.6"},
[]Symbol{ []Symbol{
{"", 3, 0, -1, VerFlagNone, 1, 134512852, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 1, 134512852, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 2, 134512876, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 2, 134512876, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 3, 134513020, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 3, 134513020, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 4, 134513292, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 4, 134513292, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 5, 134513480, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 5, 134513480, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 6, 134513512, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 6, 134513512, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 7, 134513532, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 7, 134513532, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 8, 134513612, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 8, 134513612, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 9, 134513996, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 9, 134513996, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 10, 134514008, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 10, 134514008, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 11, 134518268, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 11, 134518268, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 12, 134518280, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 12, 134518280, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 13, 134518284, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 13, 134518284, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 14, 134518436, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 14, 134518436, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 15, 134518444, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 15, 134518444, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 16, 134518452, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 16, 134518452, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 17, 134518456, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 17, 134518456, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 18, 134518484, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 18, 134518484, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 19, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 19, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 20, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 20, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 21, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 21, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 22, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 22, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 23, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 23, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 24, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 24, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 25, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 25, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 26, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 26, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 27, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 27, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 28, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 28, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 29, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 29, 0, 0, "", ""},
{"crt1.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"crt1.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"/usr/src/lib/csu/i386-elf/crti.S", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"/usr/src/lib/csu/i386-elf/crti.S", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"<command line>", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"<command line>", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"<built-in>", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"<built-in>", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"/usr/src/lib/csu/i386-elf/crti.S", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"/usr/src/lib/csu/i386-elf/crti.S", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"crtstuff.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"crtstuff.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"__CTOR_LIST__", 1, 0, -1, VerFlagNone, 14, 134518436, 0, "", ""}, {"__CTOR_LIST__", 1, 0, VersionScopeNone, -1, 14, 134518436, 0, "", ""},
{"__DTOR_LIST__", 1, 0, -1, VerFlagNone, 15, 134518444, 0, "", ""}, {"__DTOR_LIST__", 1, 0, VersionScopeNone, -1, 15, 134518444, 0, "", ""},
{"__EH_FRAME_BEGIN__", 1, 0, -1, VerFlagNone, 12, 134518280, 0, "", ""}, {"__EH_FRAME_BEGIN__", 1, 0, VersionScopeNone, -1, 12, 134518280, 0, "", ""},
{"__JCR_LIST__", 1, 0, -1, VerFlagNone, 16, 134518452, 0, "", ""}, {"__JCR_LIST__", 1, 0, VersionScopeNone, -1, 16, 134518452, 0, "", ""},
{"p.0", 1, 0, -1, VerFlagNone, 11, 134518276, 0, "", ""}, {"p.0", 1, 0, VersionScopeNone, -1, 11, 134518276, 0, "", ""},
{"completed.1", 1, 0, -1, VerFlagNone, 18, 134518484, 1, "", ""}, {"completed.1", 1, 0, VersionScopeNone, -1, 18, 134518484, 1, "", ""},
{"__do_global_dtors_aux", 2, 0, -1, VerFlagNone, 8, 134513760, 0, "", ""}, {"__do_global_dtors_aux", 2, 0, VersionScopeNone, -1, 8, 134513760, 0, "", ""},
{"object.2", 1, 0, -1, VerFlagNone, 18, 134518488, 24, "", ""}, {"object.2", 1, 0, VersionScopeNone, -1, 18, 134518488, 24, "", ""},
{"frame_dummy", 2, 0, -1, VerFlagNone, 8, 134513836, 0, "", ""}, {"frame_dummy", 2, 0, VersionScopeNone, -1, 8, 134513836, 0, "", ""},
{"crtstuff.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"crtstuff.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"__CTOR_END__", 1, 0, -1, VerFlagNone, 14, 134518440, 0, "", ""}, {"__CTOR_END__", 1, 0, VersionScopeNone, -1, 14, 134518440, 0, "", ""},
{"__DTOR_END__", 1, 0, -1, VerFlagNone, 15, 134518448, 0, "", ""}, {"__DTOR_END__", 1, 0, VersionScopeNone, -1, 15, 134518448, 0, "", ""},
{"__FRAME_END__", 1, 0, -1, VerFlagNone, 12, 134518280, 0, "", ""}, {"__FRAME_END__", 1, 0, VersionScopeNone, -1, 12, 134518280, 0, "", ""},
{"__JCR_END__", 1, 0, -1, VerFlagNone, 16, 134518452, 0, "", ""}, {"__JCR_END__", 1, 0, VersionScopeNone, -1, 16, 134518452, 0, "", ""},
{"__do_global_ctors_aux", 2, 0, -1, VerFlagNone, 8, 134513960, 0, "", ""}, {"__do_global_ctors_aux", 2, 0, VersionScopeNone, -1, 8, 134513960, 0, "", ""},
{"/usr/src/lib/csu/i386-elf/crtn.S", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"/usr/src/lib/csu/i386-elf/crtn.S", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"<command line>", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"<command line>", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"<built-in>", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"<built-in>", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"/usr/src/lib/csu/i386-elf/crtn.S", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"/usr/src/lib/csu/i386-elf/crtn.S", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"hello.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"hello.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"printf", 18, 0, -1, VerFlagNone, 0, 0, 44, "", ""}, {"printf", 18, 0, VersionScopeNone, -1, 0, 0, 44, "", ""},
{"_DYNAMIC", 17, 0, -1, VerFlagNone, 65521, 134518284, 0, "", ""}, {"_DYNAMIC", 17, 0, VersionScopeNone, -1, 65521, 134518284, 0, "", ""},
{"__dso_handle", 17, 2, -1, VerFlagNone, 11, 134518272, 0, "", ""}, {"__dso_handle", 17, 2, VersionScopeNone, -1, 11, 134518272, 0, "", ""},
{"_init", 18, 0, -1, VerFlagNone, 6, 134513512, 0, "", ""}, {"_init", 18, 0, VersionScopeNone, -1, 6, 134513512, 0, "", ""},
{"environ", 17, 0, -1, VerFlagNone, 18, 134518512, 4, "", ""}, {"environ", 17, 0, VersionScopeNone, -1, 18, 134518512, 4, "", ""},
{"__deregister_frame_info", 32, 0, -1, VerFlagNone, 0, 0, 0, "", ""}, {"__deregister_frame_info", 32, 0, VersionScopeNone, -1, 0, 0, 0, "", ""},
{"__progname", 17, 0, -1, VerFlagNone, 11, 134518268, 4, "", ""}, {"__progname", 17, 0, VersionScopeNone, -1, 11, 134518268, 4, "", ""},
{"_start", 18, 0, -1, VerFlagNone, 8, 134513612, 145, "", ""}, {"_start", 18, 0, VersionScopeNone, -1, 8, 134513612, 145, "", ""},
{"__bss_start", 16, 0, -1, VerFlagNone, 65521, 134518484, 0, "", ""}, {"__bss_start", 16, 0, VersionScopeNone, -1, 65521, 134518484, 0, "", ""},
{"main", 18, 0, -1, VerFlagNone, 8, 134513912, 46, "", ""}, {"main", 18, 0, VersionScopeNone, -1, 8, 134513912, 46, "", ""},
{"_init_tls", 18, 0, -1, VerFlagNone, 0, 0, 5, "", ""}, {"_init_tls", 18, 0, VersionScopeNone, -1, 0, 0, 5, "", ""},
{"_fini", 18, 0, -1, VerFlagNone, 9, 134513996, 0, "", ""}, {"_fini", 18, 0, VersionScopeNone, -1, 9, 134513996, 0, "", ""},
{"atexit", 18, 0, -1, VerFlagNone, 0, 0, 43, "", ""}, {"atexit", 18, 0, VersionScopeNone, -1, 0, 0, 43, "", ""},
{"_edata", 16, 0, -1, VerFlagNone, 65521, 134518484, 0, "", ""}, {"_edata", 16, 0, VersionScopeNone, -1, 65521, 134518484, 0, "", ""},
{"_GLOBAL_OFFSET_TABLE_", 17, 0, -1, VerFlagNone, 65521, 134518456, 0, "", ""}, {"_GLOBAL_OFFSET_TABLE_", 17, 0, VersionScopeNone, -1, 65521, 134518456, 0, "", ""},
{"_end", 16, 0, -1, VerFlagNone, 65521, 134518516, 0, "", ""}, {"_end", 16, 0, VersionScopeNone, -1, 65521, 134518516, 0, "", ""},
{"exit", 18, 0, -1, VerFlagNone, 0, 0, 68, "", ""}, {"exit", 18, 0, VersionScopeNone, -1, 0, 0, 68, "", ""},
{"_Jv_RegisterClasses", 32, 0, -1, VerFlagNone, 0, 0, 0, "", ""}, {"_Jv_RegisterClasses", 32, 0, VersionScopeNone, -1, 0, 0, 0, "", ""},
{"__register_frame_info", 32, 0, -1, VerFlagNone, 0, 0, 0, "", ""}, {"__register_frame_info", 32, 0, VersionScopeNone, -1, 0, 0, 0, "", ""},
}, },
}, },
{ {
@ -208,79 +208,79 @@ var fileTests = []fileTest{
}, },
[]string{"libc.so.6"}, []string{"libc.so.6"},
[]Symbol{ []Symbol{
{"", 3, 0, -1, VerFlagNone, 1, 4194816, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 1, 4194816, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 2, 4194844, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 2, 4194844, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 3, 4194880, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 3, 4194880, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 4, 4194920, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 4, 4194920, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 5, 4194952, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 5, 4194952, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 6, 4195048, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 6, 4195048, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 7, 4195110, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 7, 4195110, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 8, 4195120, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 8, 4195120, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 9, 4195152, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 9, 4195152, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 10, 4195176, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 10, 4195176, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 11, 4195224, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 11, 4195224, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 12, 4195248, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 12, 4195248, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 13, 4195296, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 13, 4195296, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 14, 4195732, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 14, 4195732, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 15, 4195748, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 15, 4195748, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 16, 4195768, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 16, 4195768, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 17, 4195808, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 17, 4195808, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 18, 6293128, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 18, 6293128, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 19, 6293144, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 19, 6293144, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 20, 6293160, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 20, 6293160, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 21, 6293168, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 21, 6293168, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 22, 6293584, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 22, 6293584, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 23, 6293592, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 23, 6293592, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 24, 6293632, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 24, 6293632, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 25, 6293656, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 25, 6293656, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 26, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 26, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 27, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 27, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 28, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 28, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 29, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 29, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 30, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 30, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 31, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 31, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 32, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 32, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 33, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 33, 0, 0, "", ""},
{"init.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"init.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"initfini.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"initfini.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"call_gmon_start", 2, 0, -1, VerFlagNone, 13, 4195340, 0, "", ""}, {"call_gmon_start", 2, 0, VersionScopeNone, -1, 13, 4195340, 0, "", ""},
{"crtstuff.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"crtstuff.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"__CTOR_LIST__", 1, 0, -1, VerFlagNone, 18, 6293128, 0, "", ""}, {"__CTOR_LIST__", 1, 0, VersionScopeNone, -1, 18, 6293128, 0, "", ""},
{"__DTOR_LIST__", 1, 0, -1, VerFlagNone, 19, 6293144, 0, "", ""}, {"__DTOR_LIST__", 1, 0, VersionScopeNone, -1, 19, 6293144, 0, "", ""},
{"__JCR_LIST__", 1, 0, -1, VerFlagNone, 20, 6293160, 0, "", ""}, {"__JCR_LIST__", 1, 0, VersionScopeNone, -1, 20, 6293160, 0, "", ""},
{"__do_global_dtors_aux", 2, 0, -1, VerFlagNone, 13, 4195376, 0, "", ""}, {"__do_global_dtors_aux", 2, 0, VersionScopeNone, -1, 13, 4195376, 0, "", ""},
{"completed.6183", 1, 0, -1, VerFlagNone, 25, 6293656, 1, "", ""}, {"completed.6183", 1, 0, VersionScopeNone, -1, 25, 6293656, 1, "", ""},
{"p.6181", 1, 0, -1, VerFlagNone, 24, 6293648, 0, "", ""}, {"p.6181", 1, 0, VersionScopeNone, -1, 24, 6293648, 0, "", ""},
{"frame_dummy", 2, 0, -1, VerFlagNone, 13, 4195440, 0, "", ""}, {"frame_dummy", 2, 0, VersionScopeNone, -1, 13, 4195440, 0, "", ""},
{"crtstuff.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"crtstuff.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"__CTOR_END__", 1, 0, -1, VerFlagNone, 18, 6293136, 0, "", ""}, {"__CTOR_END__", 1, 0, VersionScopeNone, -1, 18, 6293136, 0, "", ""},
{"__DTOR_END__", 1, 0, -1, VerFlagNone, 19, 6293152, 0, "", ""}, {"__DTOR_END__", 1, 0, VersionScopeNone, -1, 19, 6293152, 0, "", ""},
{"__FRAME_END__", 1, 0, -1, VerFlagNone, 17, 4195968, 0, "", ""}, {"__FRAME_END__", 1, 0, VersionScopeNone, -1, 17, 4195968, 0, "", ""},
{"__JCR_END__", 1, 0, -1, VerFlagNone, 20, 6293160, 0, "", ""}, {"__JCR_END__", 1, 0, VersionScopeNone, -1, 20, 6293160, 0, "", ""},
{"__do_global_ctors_aux", 2, 0, -1, VerFlagNone, 13, 4195680, 0, "", ""}, {"__do_global_ctors_aux", 2, 0, VersionScopeNone, -1, 13, 4195680, 0, "", ""},
{"initfini.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"initfini.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"hello.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"hello.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"_GLOBAL_OFFSET_TABLE_", 1, 2, -1, VerFlagNone, 23, 6293592, 0, "", ""}, {"_GLOBAL_OFFSET_TABLE_", 1, 2, VersionScopeNone, -1, 23, 6293592, 0, "", ""},
{"__init_array_end", 0, 2, -1, VerFlagNone, 18, 6293124, 0, "", ""}, {"__init_array_end", 0, 2, VersionScopeNone, -1, 18, 6293124, 0, "", ""},
{"__init_array_start", 0, 2, -1, VerFlagNone, 18, 6293124, 0, "", ""}, {"__init_array_start", 0, 2, VersionScopeNone, -1, 18, 6293124, 0, "", ""},
{"_DYNAMIC", 1, 2, -1, VerFlagNone, 21, 6293168, 0, "", ""}, {"_DYNAMIC", 1, 2, VersionScopeNone, -1, 21, 6293168, 0, "", ""},
{"data_start", 32, 0, -1, VerFlagNone, 24, 6293632, 0, "", ""}, {"data_start", 32, 0, VersionScopeNone, -1, 24, 6293632, 0, "", ""},
{"__libc_csu_fini", 18, 0, -1, VerFlagNone, 13, 4195520, 2, "", ""}, {"__libc_csu_fini", 18, 0, VersionScopeNone, -1, 13, 4195520, 2, "", ""},
{"_start", 18, 0, -1, VerFlagNone, 13, 4195296, 0, "", ""}, {"_start", 18, 0, VersionScopeNone, -1, 13, 4195296, 0, "", ""},
{"__gmon_start__", 32, 0, -1, VerFlagNone, 0, 0, 0, "", ""}, {"__gmon_start__", 32, 0, VersionScopeNone, -1, 0, 0, 0, "", ""},
{"_Jv_RegisterClasses", 32, 0, -1, VerFlagNone, 0, 0, 0, "", ""}, {"_Jv_RegisterClasses", 32, 0, VersionScopeNone, -1, 0, 0, 0, "", ""},
{"puts@@GLIBC_2.2.5", 18, 0, -1, VerFlagNone, 0, 0, 396, "", ""}, {"puts@@GLIBC_2.2.5", 18, 0, VersionScopeNone, -1, 0, 0, 396, "", ""},
{"_fini", 18, 0, -1, VerFlagNone, 14, 4195732, 0, "", ""}, {"_fini", 18, 0, VersionScopeNone, -1, 14, 4195732, 0, "", ""},
{"__libc_start_main@@GLIBC_2.2.5", 18, 0, -1, VerFlagNone, 0, 0, 450, "", ""}, {"__libc_start_main@@GLIBC_2.2.5", 18, 0, VersionScopeNone, -1, 0, 0, 450, "", ""},
{"_IO_stdin_used", 17, 0, -1, VerFlagNone, 15, 4195748, 4, "", ""}, {"_IO_stdin_used", 17, 0, VersionScopeNone, -1, 15, 4195748, 4, "", ""},
{"__data_start", 16, 0, -1, VerFlagNone, 24, 6293632, 0, "", ""}, {"__data_start", 16, 0, VersionScopeNone, -1, 24, 6293632, 0, "", ""},
{"__dso_handle", 17, 2, -1, VerFlagNone, 24, 6293640, 0, "", ""}, {"__dso_handle", 17, 2, VersionScopeNone, -1, 24, 6293640, 0, "", ""},
{"__libc_csu_init", 18, 0, -1, VerFlagNone, 13, 4195536, 137, "", ""}, {"__libc_csu_init", 18, 0, VersionScopeNone, -1, 13, 4195536, 137, "", ""},
{"__bss_start", 16, 0, -1, VerFlagNone, 65521, 6293656, 0, "", ""}, {"__bss_start", 16, 0, VersionScopeNone, -1, 65521, 6293656, 0, "", ""},
{"_end", 16, 0, -1, VerFlagNone, 65521, 6293664, 0, "", ""}, {"_end", 16, 0, VersionScopeNone, -1, 65521, 6293664, 0, "", ""},
{"_edata", 16, 0, -1, VerFlagNone, 65521, 6293656, 0, "", ""}, {"_edata", 16, 0, VersionScopeNone, -1, 65521, 6293656, 0, "", ""},
{"main", 18, 0, -1, VerFlagNone, 13, 4195480, 27, "", ""}, {"main", 18, 0, VersionScopeNone, -1, 13, 4195480, 27, "", ""},
{"_init", 18, 0, -1, VerFlagNone, 11, 4195224, 0, "", ""}, {"_init", 18, 0, VersionScopeNone, -1, 11, 4195224, 0, "", ""},
}, },
}, },
{ {
@ -338,21 +338,21 @@ var fileTests = []fileTest{
[]ProgHeader{}, []ProgHeader{},
nil, nil,
[]Symbol{ []Symbol{
{"hello.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"hello.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 1, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 1, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 3, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 3, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 4, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 4, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 5, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 5, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 6, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 6, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 8, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 8, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 9, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 9, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 11, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 11, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 13, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 13, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 15, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 15, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 16, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 16, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 14, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 14, 0, 0, "", ""},
{"main", 18, 0, -1, VerFlagNone, 1, 0, 23, "", ""}, {"main", 18, 0, VersionScopeNone, -1, 1, 0, 23, "", ""},
{"puts", 16, 0, -1, VerFlagNone, 0, 0, 0, "", ""}, {"puts", 16, 0, VersionScopeNone, -1, 0, 0, 0, "", ""},
}, },
}, },
{ {
@ -384,21 +384,21 @@ var fileTests = []fileTest{
[]ProgHeader{}, []ProgHeader{},
nil, nil,
[]Symbol{ []Symbol{
{"hello.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"hello.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 1, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 1, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 3, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 3, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 4, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 4, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 5, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 5, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 6, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 6, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 8, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 8, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 9, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 9, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 11, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 11, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 13, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 13, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 15, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 15, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 16, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 16, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 14, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 14, 0, 0, "", ""},
{"main", 18, 0, -1, VerFlagNone, 1, 0, 27, "", ""}, {"main", 18, 0, VersionScopeNone, -1, 1, 0, 27, "", ""},
{"puts", 16, 0, -1, VerFlagNone, 0, 0, 0, "", ""}, {"puts", 16, 0, VersionScopeNone, -1, 0, 0, 0, "", ""},
}, },
}, },
{ {
@ -430,21 +430,21 @@ var fileTests = []fileTest{
[]ProgHeader{}, []ProgHeader{},
nil, nil,
[]Symbol{ []Symbol{
{"hello.c", 4, 0, -1, VerFlagNone, 65521, 0, 0, "", ""}, {"hello.c", 4, 0, VersionScopeNone, -1, 65521, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 1, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 1, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 3, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 3, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 4, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 4, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 5, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 5, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 6, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 6, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 8, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 8, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 9, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 9, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 11, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 11, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 13, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 13, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 15, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 15, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 16, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 16, 0, 0, "", ""},
{"", 3, 0, -1, VerFlagNone, 14, 0, 0, "", ""}, {"", 3, 0, VersionScopeNone, -1, 14, 0, 0, "", ""},
{"main", 18, 0, -1, VerFlagNone, 1, 0, 44, "", ""}, {"main", 18, 0, VersionScopeNone, -1, 1, 0, 44, "", ""},
{"puts", 16, 0, -1, VerFlagNone, 0, 0, 0, "", ""}, {"puts", 16, 0, VersionScopeNone, -1, 0, 0, 0, "", ""},
}, },
}, },
} }

File diff suppressed because it is too large Load Diff