mirror of
https://github.com/golang/go
synced 2024-11-23 20:10:08 -07:00
cmd/link/internal/ld: remove C style gotos from ldelf
ld.ldelf contained a mixture of normal and C style, goto bad, error handling. The use of goto requires many variables to be declared well before their use which inhibited further refactoring to this method. This CL removes the gotos in this function. Future CLs will address remainder of the C style function scoped declarations in this function. Change-Id: Ib9def495209a2f8deb11dcf30ee954bca95390c6 Reviewed-on: https://go-review.googlesource.com/41172 Run-TryBot: Dave Cheney <dave@cheney.net> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
1db0aae370
commit
d728be70f4
@ -453,7 +453,6 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
var add uint64
|
var add uint64
|
||||||
var e binary.ByteOrder
|
var e binary.ByteOrder
|
||||||
var elfobj *ElfObj
|
var elfobj *ElfObj
|
||||||
var err error
|
|
||||||
var flag int
|
var flag int
|
||||||
var hdr *ElfHdrBytes
|
var hdr *ElfHdrBytes
|
||||||
var hdrbuf [64]uint8
|
var hdrbuf [64]uint8
|
||||||
@ -472,12 +471,14 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
var sym ElfSym
|
var sym ElfSym
|
||||||
var symbols []*Symbol
|
var symbols []*Symbol
|
||||||
if _, err := io.ReadFull(f, hdrbuf[:]); err != nil {
|
if _, err := io.ReadFull(f, hdrbuf[:]); err != nil {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file: %v", pn, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
hdr = new(ElfHdrBytes)
|
hdr = new(ElfHdrBytes)
|
||||||
binary.Read(bytes.NewReader(hdrbuf[:]), binary.BigEndian, hdr) // only byte arrays; byte order doesn't matter
|
binary.Read(bytes.NewReader(hdrbuf[:]), binary.BigEndian, hdr) // only byte arrays; byte order doesn't matter
|
||||||
if string(hdr.Ident[:4]) != "\x7FELF" {
|
if string(hdr.Ident[:4]) != "\x7FELF" {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file", pn)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
switch hdr.Ident[5] {
|
switch hdr.Ident[5] {
|
||||||
case ElfDataLsb:
|
case ElfDataLsb:
|
||||||
@ -487,7 +488,8 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
e = binary.BigEndian
|
e = binary.BigEndian
|
||||||
|
|
||||||
default:
|
default:
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file", pn)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// read header
|
// read header
|
||||||
@ -534,8 +536,9 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
|
|
||||||
elfobj.is64 = is64
|
elfobj.is64 = is64
|
||||||
|
|
||||||
if uint32(hdr.Ident[6]) != elfobj.version {
|
if v := uint32(hdr.Ident[6]); v != elfobj.version {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf version: got %d, want %d", pn, v, elfobj.version)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if e.Uint16(hdr.Type[:]) != ElfTypeRelocatable {
|
if e.Uint16(hdr.Type[:]) != ElfTypeRelocatable {
|
||||||
@ -603,14 +606,16 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
elfobj.nsect = uint(elfobj.shnum)
|
elfobj.nsect = uint(elfobj.shnum)
|
||||||
for i := 0; uint(i) < elfobj.nsect; i++ {
|
for i := 0; uint(i) < elfobj.nsect; i++ {
|
||||||
if f.Seek(int64(uint64(base)+elfobj.shoff+uint64(int64(i)*int64(elfobj.shentsize))), 0) < 0 {
|
if f.Seek(int64(uint64(base)+elfobj.shoff+uint64(int64(i)*int64(elfobj.shentsize))), 0) < 0 {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file", pn)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
sect = &elfobj.sect[i]
|
sect = &elfobj.sect[i]
|
||||||
if is64 != 0 {
|
if is64 != 0 {
|
||||||
var b ElfSectBytes64
|
var b ElfSectBytes64
|
||||||
|
|
||||||
if err = binary.Read(f, e, &b); err != nil {
|
if err := binary.Read(f, e, &b); err != nil {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file: %v", pn, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
sect.nameoff = e.Uint32(b.Name[:])
|
sect.nameoff = e.Uint32(b.Name[:])
|
||||||
@ -626,8 +631,9 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
} else {
|
} else {
|
||||||
var b ElfSectBytes
|
var b ElfSectBytes
|
||||||
|
|
||||||
if err = binary.Read(f, e, &b); err != nil {
|
if err := binary.Read(f, e, &b); err != nil {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file: %v", pn, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
sect.nameoff = e.Uint32(b.Name[:])
|
sect.nameoff = e.Uint32(b.Name[:])
|
||||||
@ -645,13 +651,14 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
|
|
||||||
// read section string table and translate names
|
// read section string table and translate names
|
||||||
if elfobj.shstrndx >= uint32(elfobj.nsect) {
|
if elfobj.shstrndx >= uint32(elfobj.nsect) {
|
||||||
err = fmt.Errorf("shstrndx out of range %d >= %d", elfobj.shstrndx, elfobj.nsect)
|
Errorf(nil, "%s: malformed elf file: shstrndx out of range %d >= %d", pn, elfobj.shstrndx, elfobj.nsect)
|
||||||
goto bad
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
sect = &elfobj.sect[elfobj.shstrndx]
|
sect = &elfobj.sect[elfobj.shstrndx]
|
||||||
if err = elfmap(elfobj, sect); err != nil {
|
if err := elfmap(elfobj, sect); err != nil {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file: %v", pn, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
for i := 0; uint(i) < elfobj.nsect; i++ {
|
for i := 0; uint(i) < elfobj.nsect; i++ {
|
||||||
if elfobj.sect[i].nameoff != 0 {
|
if elfobj.sect[i].nameoff != 0 {
|
||||||
@ -679,11 +686,13 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
elfobj.nsymtab = int(elfobj.symtab.size / ELF32SYMSIZE)
|
elfobj.nsymtab = int(elfobj.symtab.size / ELF32SYMSIZE)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = elfmap(elfobj, elfobj.symtab); err != nil {
|
if err := elfmap(elfobj, elfobj.symtab); err != nil {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file: %v", pn, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
if err = elfmap(elfobj, elfobj.symstr); err != nil {
|
if err := elfmap(elfobj, elfobj.symstr); err != nil {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file: %v", pn, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// load text and data segments into memory.
|
// load text and data segments into memory.
|
||||||
@ -695,8 +704,9 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
for i := 0; uint(i) < elfobj.nsect; i++ {
|
for i := 0; uint(i) < elfobj.nsect; i++ {
|
||||||
sect = &elfobj.sect[i]
|
sect = &elfobj.sect[i]
|
||||||
if sect.type_ == SHT_ARM_ATTRIBUTES && sect.name == ".ARM.attributes" {
|
if sect.type_ == SHT_ARM_ATTRIBUTES && sect.name == ".ARM.attributes" {
|
||||||
if err = elfmap(elfobj, sect); err != nil {
|
if err := elfmap(elfobj, sect); err != nil {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file: %v", pn, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
parseArmAttributes(ctxt, e, sect.base[:sect.size])
|
parseArmAttributes(ctxt, e, sect.base[:sect.size])
|
||||||
}
|
}
|
||||||
@ -704,8 +714,9 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if sect.type_ != ElfSectNobits {
|
if sect.type_ != ElfSectNobits {
|
||||||
if err = elfmap(elfobj, sect); err != nil {
|
if err := elfmap(elfobj, sect); err != nil {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file: %v", pn, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -714,8 +725,8 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
|
|
||||||
switch int(sect.flags) & (ElfSectFlagAlloc | ElfSectFlagWrite | ElfSectFlagExec) {
|
switch int(sect.flags) & (ElfSectFlagAlloc | ElfSectFlagWrite | ElfSectFlagExec) {
|
||||||
default:
|
default:
|
||||||
err = fmt.Errorf("unexpected flags for ELF section %s", sect.name)
|
Errorf(nil, "%s: unexpected flags for ELF section %s", pn, sect.name)
|
||||||
goto bad
|
return
|
||||||
|
|
||||||
case ElfSectFlagAlloc:
|
case ElfSectFlagAlloc:
|
||||||
s.Type = objabi.SRODATA
|
s.Type = objabi.SRODATA
|
||||||
@ -749,8 +760,9 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
symbols = make([]*Symbol, elfobj.nsymtab)
|
symbols = make([]*Symbol, elfobj.nsymtab)
|
||||||
|
|
||||||
for i := 1; i < elfobj.nsymtab; i++ {
|
for i := 1; i < elfobj.nsymtab; i++ {
|
||||||
if err = readelfsym(ctxt, elfobj, i, &sym, 1, localSymVersion); err != nil {
|
if err := readelfsym(ctxt, elfobj, i, &sym, 1, localSymVersion); err != nil {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file: %v", pn, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
symbols[i] = sym.sym
|
symbols[i] = sym.sym
|
||||||
if sym.type_ != ElfSymTypeFunc && sym.type_ != ElfSymTypeObject && sym.type_ != ElfSymTypeNone && sym.type_ != ElfSymTypeCommon {
|
if sym.type_ != ElfSymTypeFunc && sym.type_ != ElfSymTypeObject && sym.type_ != ElfSymTypeNone && sym.type_ != ElfSymTypeCommon {
|
||||||
@ -864,8 +876,9 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
sect = &elfobj.sect[rsect.info]
|
sect = &elfobj.sect[rsect.info]
|
||||||
if err = elfmap(elfobj, rsect); err != nil {
|
if err := elfmap(elfobj, rsect); err != nil {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file: %v", pn, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
rela = 0
|
rela = 0
|
||||||
if rsect.type_ == ElfSectRela {
|
if rsect.type_ == ElfSectRela {
|
||||||
@ -911,13 +924,14 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
if info>>32 == 0 { // absolute relocation, don't bother reading the null symbol
|
if info>>32 == 0 { // absolute relocation, don't bother reading the null symbol
|
||||||
rp.Sym = nil
|
rp.Sym = nil
|
||||||
} else {
|
} else {
|
||||||
if err = readelfsym(ctxt, elfobj, int(info>>32), &sym, 0, 0); err != nil {
|
if err := readelfsym(ctxt, elfobj, int(info>>32), &sym, 0, 0); err != nil {
|
||||||
goto bad
|
Errorf(nil, "%s: malformed elf file: %v", pn, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
sym.sym = symbols[info>>32]
|
sym.sym = symbols[info>>32]
|
||||||
if sym.sym == nil {
|
if sym.sym == nil {
|
||||||
err = fmt.Errorf("%s#%d: reloc of invalid sym #%d %s shndx=%d type=%d", sect.sym.Name, j, int(info>>32), sym.name, sym.shndx, sym.type_)
|
Errorf(nil, "%s: malformed elf file: %s#%d: reloc of invalid sym #%d %s shndx=%d type=%d", pn, sect.sym.Name, j, int(info>>32), sym.name, sym.shndx, sym.type_)
|
||||||
goto bad
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
rp.Sym = sym.sym
|
rp.Sym = sym.sym
|
||||||
@ -954,11 +968,6 @@ func ldelf(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
|
|||||||
s.R = r
|
s.R = r
|
||||||
s.R = s.R[:n]
|
s.R = s.R[:n]
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
bad:
|
|
||||||
Errorf(nil, "%s: malformed elf file: %v", pn, err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func section(elfobj *ElfObj, name string) *ElfSect {
|
func section(elfobj *ElfObj, name string) *ElfSect {
|
||||||
|
Loading…
Reference in New Issue
Block a user