mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-07 11:48:30 +00:00
Make minor improvements
- Work towards simplifying ape.S startup process - Rewrote ar because it took minutes to build cosmopolitan.a
This commit is contained in:
parent
95bc650be8
commit
aea89fe832
70 changed files with 1037 additions and 456 deletions
|
@ -20,10 +20,9 @@ COSMOPOLITAN_C_START_
|
|||
struct MappedFile;
|
||||
|
||||
Elf64_Ehdr *mapelfread(const char *, struct MappedFile *);
|
||||
char *getelfstringtable(const Elf64_Ehdr *, size_t);
|
||||
Elf64_Sym *getelfsymboltable(const Elf64_Ehdr *, size_t, Elf64_Xword *);
|
||||
Elf64_Shdr *getelfsectionbyaddress(const Elf64_Ehdr *, size_t, void *);
|
||||
bool iself64binary(const Elf64_Ehdr *, size_t);
|
||||
char *GetElfStringTable(const Elf64_Ehdr *, size_t);
|
||||
Elf64_Sym *GetElfSymbolTable(const Elf64_Ehdr *, size_t, Elf64_Xword *);
|
||||
bool IsElf64Binary(const Elf64_Ehdr *, size_t);
|
||||
|
||||
forceinline void checkelfaddress(const Elf64_Ehdr *elf, size_t mapsize,
|
||||
intptr_t addr, size_t addrsize) {
|
||||
|
@ -94,7 +93,7 @@ static inline void getelfvirtualaddressrange(const Elf64_Ehdr *elf,
|
|||
if (out_end) *out_end = end;
|
||||
}
|
||||
|
||||
static inline char *getelfstring(const Elf64_Ehdr *elf, size_t mapsize,
|
||||
static inline char *GetElfString(const Elf64_Ehdr *elf, size_t mapsize,
|
||||
const char *strtab, Elf64_Word rva) {
|
||||
intptr_t addr = (intptr_t)strtab + rva;
|
||||
#if !(TRUSTWORTHY + ELF_TRUSTWORTHY + 0)
|
||||
|
@ -105,10 +104,10 @@ static inline char *getelfstring(const Elf64_Ehdr *elf, size_t mapsize,
|
|||
return (char *)addr;
|
||||
}
|
||||
|
||||
static inline const char *getelfsectionname(const Elf64_Ehdr *elf,
|
||||
static inline const char *GetElfSectionName(const Elf64_Ehdr *elf,
|
||||
size_t mapsize, Elf64_Shdr *shdr) {
|
||||
if (!elf || !shdr) return NULL;
|
||||
return getelfstring(elf, mapsize, getelfsectionnamestringtable(elf, mapsize),
|
||||
return GetElfString(elf, mapsize, getelfsectionnamestringtable(elf, mapsize),
|
||||
shdr->sh_name);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,37 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ This program is free software; you can redistribute it and/or modify │
|
||||
│ it under the terms of the GNU General Public License as published by │
|
||||
│ the Free Software Foundation; version 2 of the License. │
|
||||
│ │
|
||||
│ This program is distributed in the hope that it will be useful, but │
|
||||
│ WITHOUT ANY WARRANTY; without even the implied warranty of │
|
||||
│ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU │
|
||||
│ General Public License for more details. │
|
||||
│ │
|
||||
│ You should have received a copy of the GNU General Public License │
|
||||
│ along with this program; if not, write to the Free Software │
|
||||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/elf/def.h"
|
||||
#include "libc/elf/elf.h"
|
||||
|
||||
Elf64_Shdr *getelfsectionbyaddress(const Elf64_Ehdr *elf, size_t mapsize,
|
||||
void *addr) {
|
||||
Elf64_Half i;
|
||||
Elf64_Shdr *shdr;
|
||||
if (elf) {
|
||||
for (i = elf->e_shnum; i > 0; --i) {
|
||||
shdr = getelfsectionheaderaddress(elf, mapsize, i - 1);
|
||||
if ((intptr_t)addr >= shdr->sh_addr &&
|
||||
(intptr_t)addr < shdr->sh_addr + shdr->sh_size) {
|
||||
return shdr;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
|
@ -20,7 +20,7 @@
|
|||
#include "libc/elf/def.h"
|
||||
#include "libc/elf/elf.h"
|
||||
|
||||
char *getelfstringtable(const Elf64_Ehdr *elf, size_t mapsize) {
|
||||
char *GetElfStringTable(const Elf64_Ehdr *elf, size_t mapsize) {
|
||||
Elf64_Half i;
|
||||
Elf64_Shdr *shdr;
|
||||
for (i = elf->e_shnum; i > 0; --i) {
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#include "libc/elf/def.h"
|
||||
#include "libc/elf/elf.h"
|
||||
|
||||
Elf64_Sym *getelfsymboltable(const Elf64_Ehdr *elf, size_t mapsize,
|
||||
Elf64_Sym *GetElfSymbolTable(const Elf64_Ehdr *elf, size_t mapsize,
|
||||
Elf64_Xword *out_count) {
|
||||
Elf64_Half i;
|
||||
Elf64_Shdr *shdr;
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/elf/elf.h"
|
||||
|
||||
bool iself64binary(const Elf64_Ehdr *elf, size_t mapsize) {
|
||||
bool IsElf64Binary(const Elf64_Ehdr *elf, size_t mapsize) {
|
||||
if (mapsize < sizeof(Elf64_Ehdr)) return false;
|
||||
if (memcmp(elf->e_ident, ELFMAG, 4)) return false;
|
||||
return (elf->e_ident[EI_CLASS] == ELFCLASSNONE ||
|
||||
|
|
|
@ -10,6 +10,7 @@ typedef struct Elf64_Sym {
|
|||
uint8_t st_info;
|
||||
/* STV_{DEFAULT,INTERNAL,HIDDEN,PROTECTED} */
|
||||
uint8_t st_other;
|
||||
/* SHN_UNDEF, <section index>, SHN_ABS, SHN_COMMON, etc. */
|
||||
Elf64_Section st_shndx;
|
||||
Elf64_Addr st_value;
|
||||
Elf64_Xword st_size;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue