RISC-V problem with weak function references and -mcmodel=medany

Jim Wilson jimw@sifive.com
Tue May 29 18:42:00 GMT 2018


On 05/29/2018 04:19 AM, Sebastian Huber wrote:
> Changing the code to something like this
> 
> void f(void) __attribute__((__weak__));
> 
> void _start(void)
> {
>          void (*g)(void) = f;
> 
>          if (g != 0) {
>                  (*g)();
>          }
> }

This testcase works for me also, using -mcmodel=medany -O tmp.c 
-Ttext=0x80000000 -nostdlib -nostartfiles.

I need enough info to reproduce your problem in order to look at it.

One thing you can try is adding -Wl,--noinhibit-exec, which will produce 
an executable even though there was a linker error, and then you can 
disassemble the binary to see what you have for the weak call.  That 
might give a clue as to what is wrong.

> Why doesn't the RISC-V generate a trampoline code to call far functions?

RISC-V is a new target.  The answer to questions like this is that we 
haven't needed it yet, and hence haven't implemented it yet.  But I 
don't see any need for trampolines to support a call to 0.  We can reach 
anywhere in the low 32-bit address space with auipc/jalr.  We can also 
use zero-relative addressing via the x0 register if necessary.  We 
already have some linker relaxation support for that, but it doesn't 
seem to be triggering for this testcase.

Jim



More information about the Gcc mailing list