https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119414

--- Comment #13 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to rdubner from comment #11)
>        IDENTIFICATION   DIVISION.
>        PROGRAM-ID.      caller.
>        PROCEDURE        DIVISION.
>            CALL "callee1" ON EXCEPTION
>               CALL "callee2" ON EXCEPTION
>                   DISPLAY "neither callee1 nor callee2 found"
>               END-CALL
>            END-CALL
>            GOBACK.
>        END PROGRAM caller.
>        IDENTIFICATION   DIVISION.
>        PROGRAM-ID.      callee2.
>        PROCEDURE        DIVISION.
>            DISPLAY "this is callee2" NO ADVANCING
>            GOBACK.
>        END PROGRAM callee2.
> 
> The instruction CALL "callee1" ON EXCEPTION means that if "callee1" can't be 
> found, then execute the code following "ON EXCEPTION" until the enclosing 
> END-CALL is encountered.
> 
> There is no callee1 to be found; there are no DSOs involved.  As you can see 
> callee2 is part of the source code module.
> 
> When compiled with "gcobol playpen.cbl", the result is a static linking 
> error:
> 
> /usr/bin/ld: /tmp/ccqZ2tzw.o: in function 
> `_para._implicit_paragraph_5._initialize_program.caller.0.67':
> playpen.cbl:(.text+0x399): undefined reference to `callee1'

So, I'd suggest to use weak symbol here for callee1.
That matches what would happen for C/C++
#include <stdio.h>
extern void callee1(void) __attribute__((weak));
void callee2(void) { printf ("this is callee2"); }
int main () { if (callee1) callee1 (); else if (callee2) callee2 (); else
printf ("neither callee1 nor callee2 found"); }
callee2 doesn't have to be weak because it is defined in the current TU.

Reply via email to