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

Reply via email to