summaryrefslogtreecommitdiff
path: root/mld/link.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-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;