diff options
author | Mitya Selivanov <automainint@guattari.tech> | 2024-07-24 16:37:32 +0200 |
---|---|---|
committer | Mitya Selivanov <automainint@guattari.tech> | 2024-07-24 16:37:32 +0200 |
commit | f89a887bd04d060bf03a8d9f76da8686dc79d9d1 (patch) | |
tree | 4bf4e5db9086c587b8766414d952bd179d5dbbac | |
parent | e7d395dfd16f44ce4bbc4c99b173f93c8c6fb96f (diff) | |
download | bxgen-f89a887bd04d060bf03a8d9f76da8686dc79d9d1.zip |
Relocations
-rwxr-xr-x | bxgen.c | 14 |
1 files changed, 10 insertions, 4 deletions
@@ -358,6 +358,7 @@ typedef struct { c8 *name; i64 section; i64 address; + i64 size; } Internal_Symbol_Entry; // Pool, a collection of all entities. @@ -2302,6 +2303,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data .name = sym_name, .section = sym_section, .address = sym_address, + .size = sym.value.size, }; u8 *begin = buf.begin + tab.data.offset + sym_index * ELF_SYMBOL_ENTRY_SIZE; @@ -2421,6 +2423,7 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data symbol = (Internal_Symbol_Entry) { .section = sec_index_global, .address = relx.symbol.value.offset, + .size = relx.symbol.value.size, }; u8 *dst = buf.begin + elf_section(buf, dst_index).data.offset + relx.offset; @@ -2446,6 +2449,9 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data // Represents the value of the symbol whose index resides in the relocation entry. i64 S = symbol.address; + // The size of the symbol whose index resides in the relocation entry. + i64 Z = symbol.size; + switch (relx.type) { #define ADD_(BITS, OP) \ do { \ @@ -2481,14 +2487,14 @@ void unit_write(Pool *pool, i64 unit, u16 target, i64 io_out, void *io_user_data case R_X86_64_TPOFF32: ADD_(32, S + A - B); break; case R_X86_64_PC64: ADD_(64, S + A - P); break; case R_X86_64_GOTOFF64: TODO_; break; - case R_X86_64_GOTPC32: TODO_; break; + case R_X86_64_GOTPC32: ADD_(32, GOT + A - P); break; case R_X86_64_GOT64: TODO_; break; case R_X86_64_GOTPCREL64: TODO_; break; - case R_X86_64_GOTPC64: TODO_; break; + case R_X86_64_GOTPC64: ADD_(64, GOT + A - P); break; case R_X86_64_GOTPLT64: TODO_; break; case R_X86_64_PLTOFF64: TODO_; break; - case R_X86_64_SIZE32: TODO_; break; - case R_X86_64_SIZE64: TODO_; break; + case R_X86_64_SIZE32: ADD_(32, Z + A); break; + case R_X86_64_SIZE64: ADD_(64, Z + A); break; case R_X86_64_GOTPC32_TLSDESC: TODO_; break; case R_X86_64_TLSDESC_CALL: TODO_; break; case R_X86_64_TLSDESC: TODO_; break; |