tinycc-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Tinycc-devel] RUNTIME_PLTGOT question


From: Thomas Stalder
Subject: Re: [Tinycc-devel] RUNTIME_PLTGOT question
Date: Wed, 26 Apr 2017 16:27:09 +0200

Hello,

I have the same issue with latest mob version :

reloc 1: x=0xfffffe val=0x1ec4c  newx=0xfdeebc9c name=printf
tcc: error: can't relocate value at 2132fa8,1

I try this :

--- arm-link.c_ori    2017-04-26 15:55:23.427465166 +0200
+++ arm-link.c    2017-04-26 16:20:03.018798813 +0200
@@ -183,6 +183,10 @@
             {
                 int x, is_thumb, is_call, h, blx_avail, is_bl, th_ko;
                 x = (*(int *) ptr) & 0xffffff;
+               if (s1->output_type == TCC_OUTPUT_MEMORY){
+                   printf("TEST RELOC\n");
+                   val = s1->plt->sh_addr;
+               }
 #ifdef DEBUG_RELOC
         printf ("reloc %d: x=0x%x val=0x%x ", type, x, val);
 #endif

but cause a segmentation fault.

The problem was describe in the thread :

Out of range jump because no PLT is used for defined symbols, which can be
a problem when compiling to memory and running from there when the
compiled code calls functions defined in the executable itself but the
code buffer is allocated too far away from those definitions.

If someone had an idea or can help me?

Thanks in advance.

Best regards,

Thomas

2016-11-09 16:18 GMT+01:00 Michael Matz <address@hidden>:
Hello,

On Mon, 7 Nov 2016, Thomas Stalder wrote:

> I have tested with latests TinyCC git commit and sometimes i have the error
> (with DEBUG_RELOC) :
>
> reloc 1: x=0xfffffe val=0x1eddc  newx=0xfdaf7d70 name=printf
> tcc: error: can't relocate value at 2527064,1

Out of range jump because no PLT is used for defined symbols, which can be
a problem when compiling to memory and running from there when the
compiled code calls functions defined in the executable itself but the
code buffer is allocated too far away from those definitions.  I fixed a
similar problem for aarch64 in 682ecc17, probably arm needs something
similar.  Untested patch below, which possibly works around this, please
try.


Ciao,
Michael.

diff --git a/tccelf.c b/tccelf.c
index 1e05bfb..a027700 100644
--- a/tccelf.c
+++ b/tccelf.c
@@ -828,7 +828,8 @@ ST_FUNC void relocate_section(TCCState *s1, Section *s)
             {
                 int x, is_thumb, is_call, h, blx_avail, is_bl, th_ko;
                 x = (*(int *) ptr) & 0xffffff;
-               if (sym->st_shndx == SHN_UNDEF)
+               if (sym->st_shndx == SHN_UNDEF
+                   || s1->output_type == TCC_OUTPUT_MEMORY)
                    val = s1->plt->sh_addr;
 #ifdef DEBUG_RELOC
                printf ("reloc %d: x=0x%x val=0x%x ", type, x, val);
@@ -1578,7 +1579,8 @@ ST_FUNC void build_got_entries(TCCState *s1)
                 sym_index = ELFW(R_SYM)(rel->r_info);
                 sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];
                if (type != R_ARM_GOTOFF && type != R_ARM_GOTPC
-                   && sym->st_shndx == SHN_UNDEF) {
+                   && (sym->st_shndx == SHN_UNDEF
+                       || s1->output_type == TCC_OUTPUT_MEMORY)) {
                     unsigned long ofs;
                     /* look at the symbol got offset. If none, then add one */
                     if (type == R_ARM_GOT32)

_______________________________________________
Tinycc-devel mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/tinycc-devel


reply via email to

[Prev in Thread] Current Thread [Next in Thread]