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 ;)