mirror of
https://github.com/golang/go
synced 2024-11-22 07:14:40 -07:00
support symbol tables and line numbers in 6.out executables
SVN=122700
This commit is contained in:
parent
e9c9c9ace5
commit
34691ccd10
@ -626,7 +626,8 @@ elf64dotout(int fd, Fhdr *fp, ExecHdr *hp)
|
|||||||
ushort (*swab)(ushort);
|
ushort (*swab)(ushort);
|
||||||
Ehdr64 *ep;
|
Ehdr64 *ep;
|
||||||
Phdr64 *ph;
|
Phdr64 *ph;
|
||||||
int i, it, id, is, phsz;
|
Shdr64 *sh;
|
||||||
|
int i, it, id, is, phsz, shsz;
|
||||||
|
|
||||||
/* bitswap the header according to the DATA format */
|
/* bitswap the header according to the DATA format */
|
||||||
ep = &hp->e.elfhdr64;
|
ep = &hp->e.elfhdr64;
|
||||||
@ -711,6 +712,17 @@ print("entry: 0x%x\n", ep->elfentry);
|
|||||||
}
|
}
|
||||||
hswal(ph, phsz/sizeof(ulong), swal);
|
hswal(ph, phsz/sizeof(ulong), swal);
|
||||||
|
|
||||||
|
shsz = sizeof(Shdr64)*ep->shnum;
|
||||||
|
sh = malloc(shsz);
|
||||||
|
if(sh) {
|
||||||
|
seek(fd, ep->shoff, 0);
|
||||||
|
if(read(fd, sh, shsz) < 0) {
|
||||||
|
free(sh);
|
||||||
|
sh = 0;
|
||||||
|
} else
|
||||||
|
hswal(ph, phsz/sizeof(ulong), swal);
|
||||||
|
}
|
||||||
|
|
||||||
/* find text, data and symbols and install them */
|
/* find text, data and symbols and install them */
|
||||||
it = id = is = -1;
|
it = id = is = -1;
|
||||||
for(i = 0; i < ep->phnum; i++) {
|
for(i = 0; i < ep->phnum; i++) {
|
||||||
@ -748,7 +760,9 @@ print("entry: 0x%x\n", ep->elfentry);
|
|||||||
}
|
}
|
||||||
|
|
||||||
werrstr("No TEXT or DATA sections");
|
werrstr("No TEXT or DATA sections");
|
||||||
|
error:
|
||||||
free(ph);
|
free(ph);
|
||||||
|
free(sh);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -756,7 +770,40 @@ print("entry: 0x%x\n", ep->elfentry);
|
|||||||
setdata(fp, ph[id].vaddr, ph[id].filesz, ph[id].offset, ph[id].memsz - ph[id].filesz);
|
setdata(fp, ph[id].vaddr, ph[id].filesz, ph[id].offset, ph[id].memsz - ph[id].filesz);
|
||||||
if(is != -1)
|
if(is != -1)
|
||||||
setsym(fp, ph[is].filesz, 0, ph[is].memsz, ph[is].offset);
|
setsym(fp, ph[is].filesz, 0, ph[is].memsz, ph[is].offset);
|
||||||
|
else if(ep->machine == AMD64 && sh != 0){
|
||||||
|
char *buf;
|
||||||
|
uvlong symsize = 0;
|
||||||
|
uvlong symoff = 0;
|
||||||
|
uvlong pclnsz = 0;
|
||||||
|
|
||||||
|
/* load shstrtab names */
|
||||||
|
buf = malloc(sh[ep->shstrndx].size);
|
||||||
|
if (buf == 0)
|
||||||
|
goto done;
|
||||||
|
memset(buf, 0, sizeof buf);
|
||||||
|
seek(fd, sh[ep->shstrndx].offset, 0);
|
||||||
|
read(fd, buf, sh[ep->shstrndx].size);
|
||||||
|
|
||||||
|
for(i = 0; i < ep->shnum; i++) {
|
||||||
|
if (sh[i].type == 2 && strcmp(&buf[sh[i].name], ".gosymtab") == 0) {
|
||||||
|
symsize = sh[i].size;
|
||||||
|
symoff = sh[i].offset;
|
||||||
|
}
|
||||||
|
if (sh[i].type == 2 && strcmp(&buf[sh[i].name], ".gopclntab") == 0) {
|
||||||
|
if (sh[i].offset != symoff+symsize) {
|
||||||
|
werrstr("pc line table not contiguous with symbol table");
|
||||||
|
free(buf);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
pclnsz = sh[i].size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setsym(fp, symsize, 0, pclnsz, symoff);
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
done:
|
||||||
free(ph);
|
free(ph);
|
||||||
|
free(sh);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
# Use of this source code is governed by a BSD-style
|
# Use of this source code is governed by a BSD-style
|
||||||
# license that can be found in the LICENSE file.
|
# license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
bash clean.bash
|
||||||
|
|
||||||
for i in lib9 libbio libmach_amd64
|
for i in lib9 libbio libmach_amd64
|
||||||
do
|
do
|
||||||
cd $i
|
cd $i
|
||||||
|
Loading…
Reference in New Issue
Block a user