mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 05:42:29 +00:00
Make changes needed for new demo
This commit is contained in:
parent
c3440d040c
commit
e6b7c16a53
13 changed files with 96 additions and 47 deletions
|
@ -105,6 +105,7 @@ static void printelfehdr(void) {
|
|||
|
||||
static void printelfsegmentheader(int i) {
|
||||
Elf64_Phdr *phdr = GetElfSegmentHeaderAddress(elf, st->st_size, i);
|
||||
if (!phdr) return;
|
||||
printf("/\tElf64_Phdr *phdr = GetElfSegmentHeaderAddress(elf, st->st_size, "
|
||||
"%d)\n",
|
||||
i);
|
||||
|
@ -133,6 +134,7 @@ static void printelfsegmentheaders(void) {
|
|||
static void printelfsectionheader(int i, char *shstrtab) {
|
||||
Elf64_Shdr *shdr;
|
||||
shdr = GetElfSectionHeaderAddress(elf, st->st_size, i);
|
||||
if (!shdr) return;
|
||||
printf("/\tElf64_Shdr *shdr = GetElfSectionHeaderAddress(elf, st->st_size, "
|
||||
"%d)\n",
|
||||
i);
|
||||
|
@ -160,7 +162,11 @@ static void printelfsectionheader(int i, char *shstrtab) {
|
|||
static void printelfsectionheaders(void) {
|
||||
Elf64_Half i;
|
||||
char *shstrtab;
|
||||
const char *str;
|
||||
Elf64_Shdr *shdr, *shshdr;
|
||||
shshdr = GetElfSectionHeaderAddress(elf, st->st_size, elf->e_shstrndx);
|
||||
shstrtab = GetElfSectionNameStringTable(elf, st->st_size);
|
||||
if (!shshdr || !shstrtab) return;
|
||||
if (shstrtab) {
|
||||
printf("\n");
|
||||
printf("\t.org\t%#x\n", elf->e_shoff);
|
||||
|
@ -168,12 +174,11 @@ static void printelfsectionheaders(void) {
|
|||
printelfsectionheader(i, shstrtab);
|
||||
}
|
||||
printf("\n/\t%s\n", "elf->e_shstrndx");
|
||||
printf("\t.org\t%#x\n",
|
||||
GetElfSectionHeaderAddress(elf, st->st_size, elf->e_shstrndx)
|
||||
->sh_offset);
|
||||
printf("\t.org\t%#x\n", shshdr->sh_offset);
|
||||
for (i = 0; i < elf->e_shnum; ++i) {
|
||||
Elf64_Shdr *shdr = GetElfSectionHeaderAddress(elf, st->st_size, i);
|
||||
const char *str = GetElfString(elf, st->st_size, shstrtab, shdr->sh_name);
|
||||
shdr = GetElfSectionHeaderAddress(elf, st->st_size, i);
|
||||
if (!shdr) break;
|
||||
str = GetElfString(elf, st->st_size, shstrtab, shdr->sh_name);
|
||||
show(".asciz", format(b1, "%`'s", str), NULL);
|
||||
}
|
||||
}
|
||||
|
@ -182,13 +187,18 @@ static void printelfsectionheaders(void) {
|
|||
static void printelfgroups(void) {
|
||||
for (int i = 0; i < elf->e_shnum; ++i) {
|
||||
Elf64_Shdr *shdr = GetElfSectionHeaderAddress(elf, st->st_size, i);
|
||||
if (!shdr) break;
|
||||
if (shdr->sh_type == SHT_GROUP) {
|
||||
const Elf64_Shdr *symhdr =
|
||||
GetElfSectionHeaderAddress(elf, st->st_size, shdr->sh_link);
|
||||
if (!symhdr) break;
|
||||
const Elf64_Shdr *strhdr =
|
||||
GetElfSectionHeaderAddress(elf, st->st_size, symhdr->sh_link);
|
||||
if (!strhdr) break;
|
||||
Elf64_Sym *syms = GetElfSectionAddress(elf, st->st_size, symhdr);
|
||||
if (!syms) break;
|
||||
char *strs = GetElfSectionAddress(elf, st->st_size, strhdr);
|
||||
if (!strs) break;
|
||||
printf("\n");
|
||||
printf("//\t%s group\n",
|
||||
GetElfString(elf, st->st_size, strs, syms[shdr->sh_info].st_name));
|
||||
|
@ -206,9 +216,11 @@ static void printelfgroups(void) {
|
|||
const Elf64_Shdr *section =
|
||||
GetElfSectionHeaderAddress(elf, st->st_size, READ32LE(p));
|
||||
printf("\t.long\t%#x\t\t\t# %s\n", READ32LE(p),
|
||||
GetElfString(elf, st->st_size,
|
||||
GetElfSectionNameStringTable(elf, st->st_size),
|
||||
section->sh_name));
|
||||
section ? GetElfString(
|
||||
elf, st->st_size,
|
||||
GetElfSectionNameStringTable(elf, st->st_size),
|
||||
section->sh_name)
|
||||
: 0);
|
||||
}
|
||||
shdr->sh_offset;
|
||||
}
|
||||
|
@ -244,14 +256,15 @@ static void printelfsymbol(Elf64_Sym *sym, char *strtab, char *shstrtab) {
|
|||
GetElfString(elf, st->st_size, strtab, sym->st_name)));
|
||||
printelfsymbolinfo(sym);
|
||||
printelfsymbolother(sym);
|
||||
Elf64_Shdr *shdr =
|
||||
GetElfSectionHeaderAddress(elf, st->st_size, sym->st_shndx);
|
||||
show(".short", format(b1, "%d", sym->st_shndx),
|
||||
format(b2, "%s sym->st_shndx",
|
||||
sym->st_shndx < 0xff00
|
||||
? format(b1, "%`'s",
|
||||
GetElfString(elf, st->st_size, shstrtab,
|
||||
GetElfSectionHeaderAddress(
|
||||
elf, st->st_size, sym->st_shndx)
|
||||
->sh_name))
|
||||
shdr ? GetElfString(elf, st->st_size, shstrtab,
|
||||
shdr->sh_name)
|
||||
: 0)
|
||||
: findnamebyid(kElfSpecialSectionNames, sym->st_shndx)));
|
||||
show(".quad", format(b1, "%#x", sym->st_value), "sym->st_value");
|
||||
show(".quad", format(b1, "%#x", sym->st_size), "sym->st_size");
|
||||
|
@ -260,13 +273,14 @@ static void printelfsymbol(Elf64_Sym *sym, char *strtab, char *shstrtab) {
|
|||
static void printelfsymboltable(void) {
|
||||
size_t i, symcount = 0;
|
||||
Elf64_Sym *symtab = GetElfSymbolTable(elf, st->st_size, &symcount);
|
||||
if (!symtab) return;
|
||||
char *strtab = GetElfStringTable(elf, st->st_size);
|
||||
char *shstrtab = GetElfSectionNameStringTable(elf, st->st_size);
|
||||
if (symtab && strtab) {
|
||||
printf("\n\n");
|
||||
printf("\t.org\t%#x\n", (intptr_t)symtab - (intptr_t)elf);
|
||||
for (i = 0; i < symcount; ++i) {
|
||||
printf(".Lsym%d:\n", i);
|
||||
printf("\n\n");
|
||||
printf("\t.org\t%#x\n", (intptr_t)symtab - (intptr_t)elf);
|
||||
for (i = 0; i < symcount; ++i) {
|
||||
printf(".Lsym%d:\n", i);
|
||||
if (strtab && shstrtab) {
|
||||
printelfsymbol(&symtab[i], strtab, shstrtab);
|
||||
}
|
||||
}
|
||||
|
@ -275,13 +289,14 @@ static void printelfsymboltable(void) {
|
|||
static void printelfdynsymboltable(void) {
|
||||
size_t i, symcount = 0;
|
||||
Elf64_Sym *symtab = GetElfDynSymbolTable(elf, st->st_size, &symcount);
|
||||
if (!symtab) return;
|
||||
char *strtab = GetElfDynStringTable(elf, st->st_size);
|
||||
char *shstrtab = GetElfSectionNameStringTable(elf, st->st_size);
|
||||
if (symtab && strtab) {
|
||||
printf("\n\n");
|
||||
printf("\t.org\t%#x\n", (intptr_t)symtab - (intptr_t)elf);
|
||||
for (i = 0; i < symcount; ++i) {
|
||||
printf(".Lsym%d:\n", i);
|
||||
printf("\n\n");
|
||||
printf("\t.org\t%#x\n", (intptr_t)symtab - (intptr_t)elf);
|
||||
for (i = 0; i < symcount; ++i) {
|
||||
printf(".Lsym%d:\n", i);
|
||||
if (strtab && shstrtab) {
|
||||
printelfsymbol(&symtab[i], strtab, shstrtab);
|
||||
}
|
||||
}
|
||||
|
@ -309,8 +324,8 @@ static void printelfrelocations(void) {
|
|||
size_t i, j, count;
|
||||
const Elf64_Sym *syms;
|
||||
const Elf64_Rela *rela;
|
||||
const Elf64_Shdr *shdr, *symtab;
|
||||
char *strtab, *shstrtab, *symbolname;
|
||||
const Elf64_Shdr *shdr, *shdr2, *symtab;
|
||||
strtab = GetElfStringTable(elf, st->st_size);
|
||||
shstrtab = GetElfSectionNameStringTable(elf, st->st_size);
|
||||
for (i = 0; i < elf->e_shnum; ++i) {
|
||||
|
@ -324,20 +339,25 @@ static void printelfrelocations(void) {
|
|||
(uintptr_t)elf + shdr->sh_offset + shdr->sh_size));
|
||||
++rela, ++j) {
|
||||
symtab = GetElfSectionHeaderAddress(elf, st->st_size, shdr->sh_link);
|
||||
if (!symtab) continue;
|
||||
count = symtab->sh_size / symtab->sh_entsize;
|
||||
syms = GetElfSectionAddress(elf, st->st_size, symtab);
|
||||
sym = ELF64_R_SYM(rela->r_info);
|
||||
if (0 <= sym && sym < count) {
|
||||
symbolname =
|
||||
getelfsymbolname(elf, st->st_size, strtab, shstrtab, syms + sym);
|
||||
if (syms && strtab && shstrtab) {
|
||||
symbolname = getelfsymbolname(elf, st->st_size, strtab, shstrtab,
|
||||
syms + sym);
|
||||
} else {
|
||||
symbolname = xasprintf("evil-sym-%d", sym);
|
||||
}
|
||||
} else {
|
||||
symbolname = xasprintf("bad-sym-%d", sym);
|
||||
}
|
||||
printf("/\t%s+%#lx → %s%c%#lx\n",
|
||||
GetElfString(
|
||||
elf, st->st_size, shstrtab,
|
||||
GetElfSectionHeaderAddress(elf, st->st_size, shdr->sh_info)
|
||||
->sh_name),
|
||||
(shdr2 =
|
||||
GetElfSectionHeaderAddress(elf, st->st_size, shdr->sh_info))
|
||||
? GetElfString(elf, st->st_size, shstrtab, shdr2->sh_name)
|
||||
: 0,
|
||||
rela->r_offset, symbolname, rela->r_addend >= 0 ? '+' : '-',
|
||||
ABS(rela->r_addend));
|
||||
printf("%s_%zu_%zu:\n", ".Lrela", i, j);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue