[PATCH 2/3] [linkers] rtems-syms: Use .quad instead of .long for riscv64

Hesham Almatary Hesham.Almatary at cl.cam.ac.uk
Mon Nov 11 12:40:05 UTC 2019


.long in RISC-V assembly is 4 bytes, while the address in riscv64
is 8 bytes (.quad). Moreover, RTEMS' libdl increases the symbols
pointer by sizeof(long) in C when iterating over global symbols.
---
 linkers/rtems-syms.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/linkers/rtems-syms.cpp b/linkers/rtems-syms.cpp
index 5ebdceb..bfe2a48 100644
--- a/linkers/rtems-syms.cpp
+++ b/linkers/rtems-syms.cpp
@@ -244,13 +244,21 @@ output_sym::operator ()(const rld::symbols::symtab::value_type& value)
 
   if (embed)
   {
+    c.write_line ("#if __riscv_xlen == 64");
+    c.write_line ("asm(\"  .quad " + sym.name () + "\");");
+    c.write_line ("#else");
     c.write_line ("asm(\"  .long " + sym.name () + "\");");
+    c.write_line ("#endif");
   }
   else
   {
     std::stringstream oss;
     oss << std::hex << std::setfill ('0') << std::setw (8) << sym.value ();
+    c.write_line ("#if __riscv_xlen == 64");
+    c.write_line ("asm(\"  .quad 0x" + oss.str () + "\");");
+    c.write_line ("#else");
     c.write_line ("asm(\"  .long 0x" + oss.str () + "\");");
+    c.write_line ("#endif");
   }
 }
 
-- 
2.17.1



More information about the devel mailing list