First big update b.cc (gnu coreutils)

This commit is contained in:
cocay 2024-01-03 22:12:10 +07:00
parent 0a070941b1
commit 7a6a41b4d8

View File

@ -127,8 +127,8 @@ uint32_t calculate_libname_hash(const libcache *cache, const char *name) {
char* p = realpath(rpath, 0);
hash = hash_func(p);
hash = fnv_hash_extend(&name[6], hash);
for (size_t i = 0; i < cache->size; i++) {
if (cache->libs[i].hash == hash) {
for (size_t j = 0; j < cache->size; j++) {
if (cache->libs[j].hash == hash) {
free(p);
return hash;
}
@ -389,12 +389,29 @@ void *get_export_trie(const void *header, uint32_t &size) {
const uint32_t offset = *((uint32_t *)ptr + 2);
size = *((uint32_t *)ptr + 3);
uint64_t offset_in_linkedit = (uint64_t)offset - linkedit_fileoffset;
printf("trie: %p\n",linkedit_vmaddr + slice + offset_in_linkedit );
if (linkedit_vmaddr + slice + offset_in_linkedit == 0x7ff888187f78) {
FILE* f = fopen("../scripts/libsystem_c.dylib", "wb");
// fwrite(header, size + linkedit_vmaddr + slice + offset_in_linkedit, 1, f);
// fwrite((char*)linkedit_vmaddr + slice + offset_in_linkedit, size, 1, f);
fclose(f);
}
return (void *)(linkedit_vmaddr + slice + offset_in_linkedit);
}
if (cmd == LC_DYLD_INFO_ONLY) {
const uint32_t offset = *((uint32_t *)ptr + 10);
size = *((uint32_t *)ptr + 11);
uint64_t offset_in_linkedit = (uint64_t)offset - linkedit_fileoffset;
printf("trie: %p\n",linkedit_vmaddr + slice + offset_in_linkedit );
if (linkedit_vmaddr + slice + offset_in_linkedit == 0x7ff888187f78) {
FILE* f = fopen("../scripts/libsystem_c.bin", "wb");
fwrite((char*)linkedit_vmaddr + slice + offset_in_linkedit, size, 1, f);
fclose(f);
}
return (void *)(linkedit_vmaddr + slice + offset_in_linkedit);
}
if (cmd == LC_SEGMENT_64) {
@ -448,7 +465,7 @@ uint32_t should_follow_symbol(char *&buffer, char *&_find) {
return is_prefix;
}
void *find_in_export_trie(const void *header, void *trie, const char *symbol) {
void *find_in_export_trie(const void *header, void *trie, char *& symbol) {
uint32_t func = 0;
char *ptr = (char *)trie;
@ -485,17 +502,23 @@ void *find_in_export_trie(const void *header, void *trie, const char *symbol) {
}
char count = *(ptr - 1);
ptr++; // flags
uint8_t flag = *ptr++; // flags
// uleb128 offset
decode_uleb128(ptr, &func);
if (flag == 0x8 /*re-export*/) {
symbol = ptr;
printf("re-export %s\n", symbol);
return 0;
}
return (void *)((char *)header + func);
}
void *find_in_lib(struct libcache *cache, struct libcache_item *lib,
const char *symbol);
char *& symbol);
void *find_in_reexport(struct libcache *cache, struct libcache_item *lib,
const char *symbol) {
char *& symbol) {
void *header = lib->header;
const uint32_t magic = *(uint32_t *)header;
char *ptr = (char *)header;
@ -531,12 +554,13 @@ void *find_in_reexport(struct libcache *cache, struct libcache_item *lib,
}
void *find_in_lib(struct libcache *cache, struct libcache_item *lib,
const char *symbol) {
char *& symbol) {
void *direct = find_in_export_trie(lib->header, lib->trie, symbol);
if (direct) {
return direct;
}
// cannot find in directly exported trie, loop through all reexport libs
// printf("looking for symbol: %s\n", symbol);
return find_in_reexport(cache, lib, symbol);
}
@ -544,7 +568,16 @@ void *custom_dlsym(struct libcache *cache, uint32_t hash, const char *symbol) {
for (size_t i = 0; i < cache->size; i++) {
struct libcache_item *cache_lib = &cache->libs[i];
if (cache_lib->hash == hash) {
return find_in_lib(cache, cache_lib, symbol);
// if (custom_strcmp(symbol, "_strlen") == 0) {
// return find_in_lib(cache, cache_lib, "__platform_strlen");
// }
char** symbol_copy = (char**)&symbol;
void* func = find_in_lib(cache, cache_lib, *symbol_copy);
if (*symbol_copy != symbol) {
printf("symbol found %p %s %s\n", func, *symbol_copy, symbol);
func = find_in_lib(cache, cache_lib, *symbol_copy);
}
return func;
}
}
return 0;
@ -864,14 +897,20 @@ void build_cache(struct libcache &cache, void *main) {
typedef int (*dyld_image_count_t)(void);
typedef char *(*dyld_get_image_name_t)(int);
typedef void *(*dyld_get_image_header_t)(int);
char* dyld_image_count_s = "__dyld_image_count";
int (*dyld_image_count_func)(void) = (dyld_image_count_t)find_in_export_trie(
libdyld, libdyld_export_trie, "__dyld_image_count");
libdyld, libdyld_export_trie, dyld_image_count_s);
char* dyld_get_image_header_s = "__dyld_get_image_header";
void *(*dyld_get_image_header_func)(int) =
(dyld_get_image_header_t)find_in_export_trie(libdyld, libdyld_export_trie,
"__dyld_get_image_header");
dyld_get_image_header_s);
char* dyld_get_image_name_s = "__dyld_get_image_name";
char *(*dyld_get_image_name_func)(int) =
(dyld_get_image_name_t)find_in_export_trie(libdyld, libdyld_export_trie,
"__dyld_get_image_name");
dyld_get_image_name_s);
cache.size = dyld_image_count_func();
cache.libs =
@ -881,7 +920,7 @@ void build_cache(struct libcache &cache, void *main) {
char *name = dyld_get_image_name_func(i);
bootstrap_libcache_item(&cache.libs[i], header, name);
cache.libs[i].hash = calculate_libname_hash(&cache, name);
// printf("%p %s\n", header, name);
printf("%p %s\n", header, name);
}
}
@ -1212,6 +1251,7 @@ void volatile custom_initializer(int argc, const char *const argv[],
free(custom_initializer_i->constructors);
}
printf("initializers completed\n");
free(custom_initializer_i);
}