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

--- Comment #12 from Iain Sandoe <iains at gcc dot gnu.org> ---
(In reply to rdubner from comment #11)
> COBOL comes from long ago, and far away.  And the vast bulk of code that I 
> never forget is where my boss, paying my salary, hopes to someday actually 
> make some money as we support migration and conversion, is mainframe code. 
> And mainframe code operates on different assumptions than those expected by 
> people who are steeped in Unix-like platforms.
> 
> (I am not a mainframe guy.  But I don't think that the customs of the Unix 
> tribe constitute natural law, either.)

I think the general idea of GCC is that it should run on as many platforms as
possible, including mainframe-like, unix-like and Windows-like. 

> Here is the test program that first alerted me to the problem that I tracked 
> down to -rdynamic.
> 
> 
>        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'

A suggestion would be to ensure that every program ID _is_ exported regardless
of whether there is a direct reference to it.  It seems that those constitute
the public symbols of the implementation.

Question - do you expect the missing "callee1" to be a link-tim error - or is
it permissible for it to be found at runtime?

I realize (from first hand experience) that it can be frustrating when one asks
how to do X and the answer comes back "what is it that you want to achieve" ..
but it's a common scenario with compiler-engineering ;)

Reply via email to