On Mon, Aug 7, 2023 at 8:52 AM Şahin Duran via Gcc <gcc@gcc.gnu.org> wrote: > > Dear GCC Developers, > > I think I've just discovered a bug/ undefined situation in the compiler. > When I try to call a weakly defined function, compiler successfully > generates the code of calling procedure. However, this calling procedure is > nothing but branching to address 0 which results in segmentation fault. I > am not sure if this is the case for the latest version of GCC but it is for > GCC 4.9.2 and many online compilers. I just thought that maybe including a > rule that generates compilation error when the user defines a weak function > and calls it without actually implementing it. You may find the results in > the attachments.
You need to check the address of weak defined symbol (function) to make sure it is not a nullptr before calling it. A weak defined symbol might have the address of nullptr if it is not defined. And you are running into that. This is a feature of elf and weak symbols. Thanks, Andrew > > Kind regards, > I am looking forward to hearing from you about this. > Şahin Duran > > > Attachments: > > Source Code: > #include <stdio.h> > #include <stdlib.h> > #include "header.h" > > __attribute__((weak)) int add(int,int); > > int main(int argc, char *argv[]) { > printf("%x",add); > add(31,31); > return 0; > } > terminal result : 0 > > Disassembly (on a 64bit AMD Machine): > 0x0000000000401530 <+0>: push rbp > 0x0000000000401531 <+1>: mov rbp,rsp > 0x0000000000401534 <+4>: sub rsp,0x20 > 0x0000000000401538 <+8>: mov DWORD PTR [rbp+0x10],ecx > 0x000000000040153b <+11>: mov QWORD PTR [rbp+0x18],rdx > 0x000000000040153f <+15>: call 0x402100 <__main> > 0x0000000000401544 <+20>: mov rdx,QWORD PTR [rip+0x2ed5] # > 0x404420 <.refptr.add> > 0x000000000040154b <+27>: lea rcx,[rip+0x2aae] # 0x404000 > 0x0000000000401552 <+34>: call 0x402b18 <printf> > => 0x0000000000401557 <+39>: mov edx,0x1f > 0x000000000040155c <+44>: mov ecx,0x1f > 0x0000000000401561 <+49>: call 0x0 > 0x0000000000401566 <+54>: mov eax,0x0 > 0x000000000040156b <+59>: add rsp,0x20 > 0x000000000040156f <+63>: pop rbp > 0x0000000000401570 <+64>: ret