summaryrefslogtreecommitdiff
path: root/mld/link.h
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-09-23 10:13:38 -0400
committerFreya Murphy <freya@freyacat.org>2024-09-23 10:13:38 -0400
commit9d3d75fecbf89ca526b95dd824b15a4d284e05c8 (patch)
tree969c28f4090595853a9ad863bb3812020b5aecaf /mld/link.h
parentupdate readme (diff)
downloadmips-9d3d75fecbf89ca526b95dd824b15a4d284e05c8.tar.gz
mips-9d3d75fecbf89ca526b95dd824b15a4d284e05c8.tar.bz2
mips-9d3d75fecbf89ca526b95dd824b15a4d284e05c8.zip
fix local vs global symbol names, locals now are local
Diffstat (limited to 'mld/link.h')
-rw-r--r--mld/link.h30
1 files changed, 28 insertions, 2 deletions
diff --git a/mld/link.h b/mld/link.h
index 9096975..6c3b714 100644
--- a/mld/link.h
+++ b/mld/link.h
@@ -39,6 +39,9 @@
struct linker;
struct object;
struct segment;
+struct string_table;
+struct symbol_table;
+struct symbol_table_mapping;
///
/// relocation table
@@ -79,13 +82,35 @@ struct symbol_table {
Elf32_Sym *syms;
size_t len;
size_t size;
+
+ // mapping for global symbol table
+ // can be null
+ // (metadata for each symbol)
+ struct symbol_table_mapping *map;
};
+///
+/// symbol table map
+/// (metadata for each symbol)
+///
+
int symtab_init(struct symbol_table *symtab);
void symtab_free(struct symbol_table *symtab);
int symtab_push(struct symbol_table *symtab, const Elf32_Sym *sym);
-int symtab_get(struct symbol_table *symtab, Elf32_Sym **sym, const char *name);
+int symtab_get(struct symbol_table *symtab, Elf32_Sym **sym, const char *name,
+ int32_t obj_idx);
+
+struct symbol_table_mapping {
+ uint32_t len;
+ uint32_t size;
+ struct object **meta;
+};
+
+int symtab_map_push(struct symbol_table_mapping *symtabm, struct object *seg);
+
+int symtab_map_init(struct symbol_table_mapping *symtabm);
+void symtab_map_free(struct symbol_table_mapping *symtabm);
///
/// segment
@@ -211,7 +236,7 @@ struct object {
struct symbol_table *symtabs;
};
-int object_load(struct object *object, char *path);
+int object_load(struct object *object, char *path, uint32_t index);
void object_free(struct object *object);
@@ -235,6 +260,7 @@ struct linker {
struct string_table shstrtab;
struct string_table strtab;
struct symbol_table symtab;
+ struct symbol_table_mapping symtab_map;
// output elf
Elf32_Ehdr ehdr;