The 64-bit PowerPC ELFv2 relocation support needs access to the Elf_Sym::st_other symbol information. The machine-specific relocation handler had only access to the Elf_Sym::st_info symbol information. This change extends the 8-bit syminfo parameter to 16-bit and uses the additional 8-bits to provide Elf_Sym::st_other. Another approach could be to pass a pointer to an Elf_Sym object instead of symname, syminfo, and symvalue.
Update #4996. --- cpukit/libdl/rtl-elf.c | 12 ++++++------ cpukit/libdl/rtl-elf.h | 8 ++++---- cpukit/libdl/rtl-mdreloc-powerpc.c | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cpukit/libdl/rtl-elf.c b/cpukit/libdl/rtl-elf.c index dddf9aceab..cf56929198 100644 --- a/cpukit/libdl/rtl-elf.c +++ b/cpukit/libdl/rtl-elf.c @@ -275,7 +275,7 @@ rtems_rtl_elf_reloc_parser (rtems_rtl_obj* obj, (uintmax_t) symvalue, (int) ELF_R_TYPE (rela->r_info), (uintmax_t) rela->r_offset, (int) rela->r_addend); rs = rtems_rtl_elf_relocate_rela_tramp (obj, rela, targetsect, - symname, sym->st_info, symvalue); + symname, (sym->st_other << 8) | sym->st_info, symvalue); rel_words[REL_R_OFFSET] = rela->r_offset; rel_words[REL_R_INFO] = rela->r_info; rel_words[REL_R_ADDEND] = rela->r_addend; @@ -392,7 +392,7 @@ rtems_rtl_elf_reloc_relocator (rtems_rtl_obj* obj, (uintmax_t) symvalue, (int) ELF_R_TYPE (rela->r_info), (uintmax_t) rela->r_offset, (int) rela->r_addend); rs = rtems_rtl_elf_relocate_rela (obj, rela, targetsect, - symname, sym->st_info, symvalue); + symname, (sym->st_other << 8) | sym->st_info, symvalue); if (rs != rtems_rtl_elf_rel_no_error) return false; } @@ -404,7 +404,7 @@ rtems_rtl_elf_reloc_relocator (rtems_rtl_obj* obj, (uintmax_t) symvalue, (int) ELF_R_TYPE (rel->r_info), (uintmax_t) rel->r_offset); rs = rtems_rtl_elf_relocate_rel (obj, rel, targetsect, - symname, sym->st_info, symvalue); + symname, (sym->st_other << 8) | sym->st_info, symvalue); if (rs != rtems_rtl_elf_rel_no_error) return false; } @@ -1217,7 +1217,7 @@ rtems_rtl_elf_symbols_load (rtems_rtl_obj* obj, memcpy (string, name, strlen (name) + 1); osym->name = string; osym->value = (void*) (intptr_t) value; - osym->data = symbol.st_shndx; + osym->data = (symbol.st_other << 8) | symbol.st_shndx; if (rtems_rtl_trace (RTEMS_RTL_TRACE_SYMBOL)) printf ("rtl: sym:add:%-4d name:%-4d: %-20s: bind:%-2d " \ @@ -1246,7 +1246,7 @@ rtems_rtl_elf_symbols_locate (rtems_rtl_obj* obj, { rtems_rtl_obj_sym* osym = &obj->local_table[sym]; rtems_rtl_obj_sect* symsect; - symsect = rtems_rtl_obj_find_section_by_index (obj, osym->data); + symsect = rtems_rtl_obj_find_section_by_index (obj, osym->data & 0xff); if (symsect) { osym->value += (intptr_t) symsect->base; @@ -1261,7 +1261,7 @@ rtems_rtl_elf_symbols_locate (rtems_rtl_obj* obj, { rtems_rtl_obj_sym* osym = &obj->global_table[sym]; rtems_rtl_obj_sect* symsect; - symsect = rtems_rtl_obj_find_section_by_index (obj, osym->data); + symsect = rtems_rtl_obj_find_section_by_index (obj, osym->data & 0xff); if (symsect) { osym->value += (intptr_t) symsect->base; diff --git a/cpukit/libdl/rtl-elf.h b/cpukit/libdl/rtl-elf.h index 0476c1ecd7..98b460e6f4 100644 --- a/cpukit/libdl/rtl-elf.h +++ b/cpukit/libdl/rtl-elf.h @@ -185,7 +185,7 @@ rtems_rtl_elf_rel_status rtems_rtl_elf_relocate_rel_tramp (rtems_rtl_obj* const Elf_Rel* rel, const rtems_rtl_obj_sect* sect, const char* symname, - const Elf_Byte syminfo, + const Elf_Half syminfo, const Elf_Word symvalue); /** @@ -205,7 +205,7 @@ rtems_rtl_elf_rel_status rtems_rtl_elf_relocate_rela_tramp (rtems_rtl_obj* const Elf_Rela* rela, const rtems_rtl_obj_sect* sect, const char* symname, - const Elf_Byte syminfo, + const Elf_Half syminfo, const Elf_Word symvalue); /** @@ -225,7 +225,7 @@ rtems_rtl_elf_rel_status rtems_rtl_elf_relocate_rel (rtems_rtl_obj* o const Elf_Rel* rel, const rtems_rtl_obj_sect* sect, const char* symname, - const Elf_Byte syminfo, + const Elf_Half syminfo, const Elf_Word symvalue); /** @@ -245,7 +245,7 @@ rtems_rtl_elf_rel_status rtems_rtl_elf_relocate_rela (rtems_rtl_obj* const Elf_Rela* rela, const rtems_rtl_obj_sect* sect, const char* symname, - const Elf_Byte syminfo, + const Elf_Half syminfo, const Elf_Word symvalue); /** diff --git a/cpukit/libdl/rtl-mdreloc-powerpc.c b/cpukit/libdl/rtl-mdreloc-powerpc.c index 09e4f49a19..b8962c5689 100644 --- a/cpukit/libdl/rtl-mdreloc-powerpc.c +++ b/cpukit/libdl/rtl-mdreloc-powerpc.c @@ -262,7 +262,7 @@ rtems_rtl_elf_reloc_rela (rtems_rtl_obj* obj, const Elf_Rela* rela, const rtems_rtl_obj_sect* sect, const char* symname, - const Elf_Byte syminfo, + const Elf_Half syminfo, const Elf_Word symvalue, const bool parsing) { @@ -667,7 +667,7 @@ rtems_rtl_elf_relocate_rela_tramp (rtems_rtl_obj* obj, const Elf_Rela* rela, const rtems_rtl_obj_sect* sect, const char* symname, - const Elf_Byte syminfo, + const Elf_Half syminfo, const Elf_Word symvalue) { return rtems_rtl_elf_reloc_rela (obj, @@ -684,7 +684,7 @@ rtems_rtl_elf_relocate_rela (rtems_rtl_obj* obj, const Elf_Rela* rela, const rtems_rtl_obj_sect* sect, const char* symname, - const Elf_Byte syminfo, + const Elf_Half syminfo, const Elf_Word symvalue) { return rtems_rtl_elf_reloc_rela (obj, @@ -701,7 +701,7 @@ rtems_rtl_elf_relocate_rel_tramp (rtems_rtl_obj* obj, const Elf_Rel* rel, const rtems_rtl_obj_sect* sect, const char* symname, - const Elf_Byte syminfo, + const Elf_Half syminfo, const Elf_Word symvalue) { (void) obj; @@ -719,7 +719,7 @@ rtems_rtl_elf_relocate_rel (rtems_rtl_obj* obj, const Elf_Rel* rel, const rtems_rtl_obj_sect* sect, const char* symname, - const Elf_Byte syminfo, + const Elf_Half syminfo, const Elf_Word symvalue) { (void) obj; -- 2.35.3 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel