Hello,

I have made somes tests and the commit :

http://repo.or.cz/tinycc.git/commitdiff/ca92bfc3c64128872793c167de3a58
a78b9a1299

reintroduces the problem.

Thanks in advance.

Best regards,
Thomas

2017-04-26 16:27 GMT+02:00 Thomas Stalder <[email protected]>:

> 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 <[email protected]>:
>
>> 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
>> [email protected]
>> https://lists.nongnu.org/mailman/listinfo/tinycc-devel
>>
>
>
_______________________________________________
Tinycc-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to