mirror of
https://github.com/golang/go
synced 2024-11-25 03:27:58 -07:00
ld: allow relocations pointing at ELF .bss symbols
R=r, r2 CC=golang-dev https://golang.org/cl/3710042
This commit is contained in:
parent
0cd3475386
commit
01464cf956
@ -322,7 +322,7 @@ ldelf(Biobuf *f, char *pkg, int64 len, char *pn)
|
|||||||
uchar *p, *dp;
|
uchar *p, *dp;
|
||||||
ElfHdrBytes *hdr;
|
ElfHdrBytes *hdr;
|
||||||
ElfObj *obj;
|
ElfObj *obj;
|
||||||
ElfSect *sect, *rsect, *text, *data, *bss, *rodata;
|
ElfSect *sect, *rsect;
|
||||||
ElfSym sym;
|
ElfSym sym;
|
||||||
Endian *e;
|
Endian *e;
|
||||||
Reloc *r, *rp;
|
Reloc *r, *rp;
|
||||||
@ -506,23 +506,13 @@ ldelf(Biobuf *f, char *pkg, int64 len, char *pn)
|
|||||||
// they are not as small as the section lists, but we'll need
|
// they are not as small as the section lists, but we'll need
|
||||||
// the memory anyway for the symbol images, so we might
|
// the memory anyway for the symbol images, so we might
|
||||||
// as well use one large chunk.
|
// as well use one large chunk.
|
||||||
text = section(obj, ".text");
|
|
||||||
if(text && map(obj, text) < 0)
|
|
||||||
goto bad;
|
|
||||||
data = section(obj, ".data");
|
|
||||||
if(data && map(obj, data) < 0)
|
|
||||||
goto bad;
|
|
||||||
bss = section(obj, ".bss");
|
|
||||||
rodata = section(obj, ".rodata");
|
|
||||||
if(rodata && map(obj, rodata) < 0)
|
|
||||||
goto bad;
|
|
||||||
|
|
||||||
// create symbols for mapped sections
|
// create symbols for mapped sections
|
||||||
for(i=0; i<obj->nsect; i++) {
|
for(i=0; i<obj->nsect; i++) {
|
||||||
sect = &obj->sect[i];
|
sect = &obj->sect[i];
|
||||||
if(sect->type != ElfSectProgbits || !(sect->flags&ElfSectFlagAlloc))
|
if((sect->type != ElfSectProgbits && sect->type != ElfSectNobits) || !(sect->flags&ElfSectFlagAlloc))
|
||||||
continue;
|
continue;
|
||||||
if(map(obj, sect) < 0)
|
if(sect->type != ElfSectNobits && map(obj, sect) < 0)
|
||||||
goto bad;
|
goto bad;
|
||||||
|
|
||||||
name = smprint("%s(%s)", pn, sect->name);
|
name = smprint("%s(%s)", pn, sect->name);
|
||||||
@ -542,8 +532,10 @@ ldelf(Biobuf *f, char *pkg, int64 len, char *pn)
|
|||||||
s->type = STEXT;
|
s->type = STEXT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->p = sect->base;
|
if(sect->type == ElfSectProgbits) {
|
||||||
s->np = sect->size;
|
s->p = sect->base;
|
||||||
|
s->np = sect->size;
|
||||||
|
}
|
||||||
s->size = sect->size;
|
s->size = sect->size;
|
||||||
if(s->type == STEXT) {
|
if(s->type == STEXT) {
|
||||||
if(etextp)
|
if(etextp)
|
||||||
@ -598,7 +590,8 @@ ldelf(Biobuf *f, char *pkg, int64 len, char *pn)
|
|||||||
if(readsym(obj, info>>32, &sym) < 0)
|
if(readsym(obj, info>>32, &sym) < 0)
|
||||||
goto bad;
|
goto bad;
|
||||||
if(sym.sym == nil) {
|
if(sym.sym == nil) {
|
||||||
werrstr("reloc of invalid sym %s shndx=%d type=%d", sym.name, sym.shndx, sym.type);
|
werrstr("%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);
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
rp->sym = sym.sym;
|
rp->sym = sym.sym;
|
||||||
|
Loading…
Reference in New Issue
Block a user