[rtems-tools commit] rtemstoolkit/rap: Ignore R_ARM_V4BX relocation records
Chris Johns
chrisj at rtems.org
Mon Apr 16 01:57:41 UTC 2018
Module: rtems-tools
Branch: master
Commit: ec419a05ee52869a7d5b8712ea8e7a7d74fde096
Changeset: http://git.rtems.org/rtems-tools/commit/?id=ec419a05ee52869a7d5b8712ea8e7a7d74fde096
Author: Chris Johns <chrisj at rtems.org>
Date: Mon Apr 16 11:55:01 2018 +1000
rtemstoolkit/rap: Ignore R_ARM_V4BX relocation records
Note, this removes the detalis needed to alter the instruction for
an ARMv4 instruction set. Currently this type of record is not handled
in the RAP format loader and the RTL loader ignores it.
Close #3396
---
rtemstoolkit/rld-rap.cpp | 90 +++++++++++++++++++++++++++++++++++++++---------
1 file changed, 74 insertions(+), 16 deletions(-)
diff --git a/rtemstoolkit/rld-rap.cpp b/rtemstoolkit/rld-rap.cpp
index 9b87279..455328a 100644
--- a/rtemstoolkit/rld-rap.cpp
+++ b/rtemstoolkit/rld-rap.cpp
@@ -438,6 +438,49 @@ namespace rld
uint32_t fini_off; //< The strtab offset to the fini label.
};
+ /*
+ * Per machine specific special handling.
+ */
+ bool
+ machine_symbol_check (const symbols::symbol& sym)
+ {
+ int symsec = sym.section_index ();
+
+ /*
+ * Ignore section index 0
+ */
+ if (symsec == 0)
+ return false;
+
+ /*
+ * Ignore sparc common section
+ */
+ if ((elf::object_machine_type () == EM_SPARC) && (symsec == 65522))
+ return false;
+
+ return true;
+ }
+
+ bool
+ machine_relocation_check (const files::relocation& reloc)
+ {
+ /*
+ * Drop some ARM relocations.
+ */
+ if (elf::object_machine_type () == EM_ARM)
+ {
+ switch (reloc.type)
+ {
+ case 40: /* R_ARM_V4BX */
+ return false;
+ default:
+ break;
+ }
+ }
+
+ return true;
+ }
+
const char*
section_name (int sec)
{
@@ -726,19 +769,24 @@ namespace rld
++fri, ++rc)
{
const files::relocation& freloc = *fri;
+ bool merge_reloc = machine_relocation_check (freloc);
if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
std::cout << " " << std::setw (2) << sec.relocs.size ()
- << '/' << std::setw (2) << rc
- << std::hex << ": reloc.info=0x" << freloc.info << std::dec
+ << '/' << std::setw (2) << rc << ':'
+ << " merge=" << merge_reloc
+ << std::hex
+ << " reloc.type=" << freloc.type
+ << " reloc.info=0x" << freloc.info
+ << std::dec
<< " reloc.offset=" << freloc.offset
<< " reloc.addend=" << freloc.addend
<< " reloc.symtype=" << freloc.symtype
<< " reloc.symsect=" << freloc.symsect
<< " reloc.symbinding=" << freloc.symbinding
<< std::endl;
-
- sec.relocs.push_back (relocation (freloc, offset));
+ if (merge_reloc)
+ sec.relocs.push_back (relocation (freloc, offset));
}
std::stable_sort (sec.relocs.begin (),
@@ -1014,13 +1062,12 @@ namespace rld
{
if ((sym.binding () == STB_GLOBAL) || (sym.binding () == STB_WEAK))
{
- int symsec = sym.section_index ();
+ int symsec = sym.section_index ();
- /* Ignore section index 0 */
- if (symsec == 0)
- continue;
- /* Ignore sparc common section */
- if ((elf::object_machine_type () == EM_SPARC) && (symsec == 65522))
+ /*
+ * Do not noting if the symbol is reject at the machine level.
+ */
+ if (!machine_symbol_check (sym))
continue;
sections rap_sec = obj.find (symsec);
@@ -1354,6 +1401,21 @@ namespace rld
offset = sec.offset + reloc.offset;
+ if (rld::verbose () >= RLD_VERBOSE_TRACE)
+ std::cout << " " << std::setw (2) << sr
+ << '/' << std::setw (2) << rc << ':'
+ << std::hex
+ << " reloc.info=0x" << reloc.info
+ << std::dec
+ << " reloc.offset=" << reloc.offset
+ << " reloc.addend=" << reloc.addend
+ << " reloc.symtype=" << reloc.symtype
+ << " reloc.symsect=" << reloc.symsect
+ << " (" << obj.obj.get_section (reloc.symsect).name << ')'
+ << " reloc.symvalue=" << reloc.symvalue
+ << " reloc.symbinding=" << reloc.symbinding
+ << std::endl;
+
if ((reloc.symtype == STT_SECTION) || (reloc.symbinding == STB_LOCAL))
{
int rap_symsect = obj.find (reloc.symsect);
@@ -1371,15 +1433,11 @@ namespace rld
if (rld::verbose () >= RLD_VERBOSE_TRACE)
std::cout << " " << std::setw (2) << sr
- << '/' << std::setw (2) << rc
- <<": rsym: sect=" << section_names[rap_symsect]
+ << '/' << std::setw (2) << rc << ':'
+ << " rsym: sect=" << section_names[rap_symsect]
<< " rap_symsect=" << rap_symsect
<< " sec.offset=" << obj.secs[rap_symsect].offset
<< " sec.osecs=" << obj.secs[rap_symsect].osecs[reloc.symsect].offset
- << " (" << obj.obj.get_section (reloc.symsect).name << ')'
- << " reloc.symsect=" << reloc.symsect
- << " reloc.symvalue=" << reloc.symvalue
- << " reloc.addend=" << reloc.addend
<< " addend=" << addend
<< std::endl;
}
More information about the vc
mailing list