Well, isn't this an interesting turn of events! So I tried your (Ivan's) idea of looking at what the linker's doing when the binary is run. This is the output:
19216:
19216: file=libpoppler-cpp.so.0 [0]; needed by Source/obj/WindowServer [0]
19216: find library=libpoppler-cpp.so.0 [0]; searching
19216: search path=/home/jamie/Developer/System/lib/tls/x86_64:/home/jamie/Developer/System/lib/tls:/home/jamie/Developer/System/lib/x86_64:/home/jamie/Developer/System/lib (LD_LIBRARY_PATH)
19216: trying file=/home/jamie/Developer/System/lib/tls/x86_64/libpoppler-cpp.so.0
19216: trying file=/home/jamie/Developer/System/lib/tls/libpoppler-cpp.so.0
19216: trying file=/home/jamie/Developer/System/lib/x86_64/libpoppler-cpp.so.0
19216: trying file=/home/jamie/Developer/System/lib/libpoppler-cpp.so.0
19216:
19216: file=libpoppler-cpp.so.0 [0]; generating link map
19216: dynamic: 0x00007f8f1c191d78 base: 0x00007f8f1bf80000 size: 0x00000000002125d8
19216: entry: 0x00007f8f1bf885e0 phdr: 0x00007f8f1bf80040 phnum: 7
19216:
19216:
19216: file=libgnustep-base.so.1.24 [0]; needed by Source/obj/WindowServer [0]
19216: find library=libgnustep-base.so.1.24 [0]; searching
19216: search path=/home/jamie/Developer/System/lib (LD_LIBRARY_PATH)
19216: trying file=/home/jamie/Developer/System/lib/libgnustep-base.so.1.24
19216: search cache=/etc/ld.so.cache
19216: search path=/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu:/lib/tls/x86_64:/lib/tls:/lib/x86_64:/lib:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/x86_64:/usr/lib (system search path) 19216: trying file=/lib/x86_64-linux-gnu/tls/x86_64/libgnustep-base.so.1.24
19216: trying file=/lib/x86_64-linux-gnu/tls/libgnustep-base.so.1.24
19216: trying file=/lib/x86_64-linux-gnu/x86_64/libgnustep-base.so.1.24
19216: trying file=/lib/x86_64-linux-gnu/libgnustep-base.so.1.24
19216: trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/libgnustep-base.so.1.24
19216: trying file=/usr/lib/x86_64-linux-gnu/tls/libgnustep-base.so.1.24
19216: trying file=/usr/lib/x86_64-linux-gnu/x86_64/libgnustep-base.so.1.24
19216: trying file=/usr/lib/x86_64-linux-gnu/libgnustep-base.so.1.24
19216: trying file=/lib/tls/x86_64/libgnustep-base.so.1.24
19216: trying file=/lib/tls/libgnustep-base.so.1.24
19216: trying file=/lib/x86_64/libgnustep-base.so.1.24
19216: trying file=/lib/libgnustep-base.so.1.24
19216: trying file=/usr/lib/tls/x86_64/libgnustep-base.so.1.24
19216: trying file=/usr/lib/tls/libgnustep-base.so.1.24
19216: trying file=/usr/lib/x86_64/libgnustep-base.so.1.24
19216: trying file=/usr/lib/libgnustep-base.so.1.24
19216:
It's not finding libgnustep-base.so.1.24, but we knew that. Yet I had been using GNUstep apps with no problem. So I checked doing openapp LevelEditor and it worked fine, as I expected, and spewed out some 27 MB of diagnostic messages to the console. Clearly it was finding libgnustep-base.so.1.24. So why did the app work but not my binary. I tried running LevelEditor directly. Then this happened:
LD_DEBUG=all ~/Developer/System/bin/LevelEditor
19318:
19318: file=libxmp.so.4 [0]; needed by /home/jamie/Developer/System/bin/LevelEditor [0]
19318: find library=libxmp.so.4 [0]; searching
19318: search path=/home/jamie/Developer/System/lib/tls/x86_64:/home/jamie/Developer/System/lib/tls:/home/jamie/Developer/System/lib/x86_64:/home/jamie/Developer/System/lib (LD_LIBRARY_PATH)
19318: trying file=/home/jamie/Developer/System/lib/tls/x86_64/libxmp.so.4
19318: trying file=/home/jamie/Developer/System/lib/tls/libxmp.so.4
19318: trying file=/home/jamie/Developer/System/lib/x86_64/libxmp.so.4
19318: trying file=/home/jamie/Developer/System/lib/libxmp.so.4
19318:
19318: file=libxmp.so.4 [0]; generating link map
19318: dynamic: 0x00007f67633cbdc0 base: 0x00007f6763167000 size: 0x00000000002661e0
19318: entry: 0x00007f676316c2e0 phdr: 0x00007f6763167040 phnum: 7
19318:
19318:
19318: file=libsndfile.so.1 [0]; needed by /home/jamie/Developer/System/bin/LevelEditor [0]
19318: find library=libsndfile.so.1 [0]; searching
19318: search path=/home/jamie/Developer/System/lib (LD_LIBRARY_PATH)
19318: trying file=/home/jamie/Developer/System/lib/libsndfile.so.1
19318:
19318: file=libsndfile.so.1 [0]; generating link map
19318: dynamic: 0x00007f6763163d70 base: 0x00007f6762eff000 size: 0x0000000000267f20
19318: entry: 0x00007f6762f057c0 phdr: 0x00007f6762eff040 phnum: 7
19318:
19318:
19318: file=libao.so.4 [0]; needed by /home/jamie/Developer/System/bin/LevelEditor [0]
19318: find library=libao.so.4 [0]; searching
19318: search path=/home/jamie/Developer/System/lib (LD_LIBRARY_PATH)
19318: trying file=/home/jamie/Developer/System/lib/libao.so.4
19318: search cache=/etc/ld.so.cache
19318: trying file=/usr/lib/x86_64-linux-gnu/libao.so.4
19318:
19318: file=libao.so.4 [0]; generating link map
19318: dynamic: 0x00007f6762efdda8 base: 0x00007f6762cf6000 size: 0x00000000002087a8
19318: entry: 0x00007f6762cf7e70 phdr: 0x00007f6762cf6040 phnum: 7
19318:
19318:
19318: file=libgnustep-gui.so.0.25 [0]; needed by /home/jamie/Developer/System/bin/LevelEditor [0]
19318: find library=libgnustep-gui.so.0.25 [0]; searching
19318: search path=/home/jamie/Developer/System/lib (LD_LIBRARY_PATH)
19318: trying file=/home/jamie/Developer/System/lib/libgnustep-gui.so.0.25
19318: search cache=/etc/ld.so.cache
19318: search path=/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu:/lib/tls/x86_64:/lib/tls:/lib/x86_64:/lib:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/x86_64:/usr/lib (system search path) 19318: trying file=/lib/x86_64-linux-gnu/tls/x86_64/libgnustep-gui.so.0.25
19318: trying file=/lib/x86_64-linux-gnu/tls/libgnustep-gui.so.0.25
19318: trying file=/lib/x86_64-linux-gnu/x86_64/libgnustep-gui.so.0.25
19318: trying file=/lib/x86_64-linux-gnu/libgnustep-gui.so.0.25
19318: trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/libgnustep-gui.so.0.25
19318: trying file=/usr/lib/x86_64-linux-gnu/tls/libgnustep-gui.so.0.25
19318: trying file=/usr/lib/x86_64-linux-gnu/x86_64/libgnustep-gui.so.0.25
19318: trying file=/usr/lib/x86_64-linux-gnu/libgnustep-gui.so.0.25
19318: trying file=/lib/tls/x86_64/libgnustep-gui.so.0.25
19318: trying file=/lib/tls/libgnustep-gui.so.0.25
19318: trying file=/lib/x86_64/libgnustep-gui.so.0.25
19318: trying file=/lib/libgnustep-gui.so.0.25
19318: trying file=/usr/lib/tls/x86_64/libgnustep-gui.so.0.25
19318: trying file=/usr/lib/tls/libgnustep-gui.so.0.25
19318: trying file=/usr/lib/x86_64/libgnustep-gui.so.0.25
19318: trying file=/usr/lib/libgnustep-gui.so.0.25
19318:
/home/jamie/Developer/System/bin/LevelEditor: error while loading shared libraries: libgnustep-gui.so.0.25: cannot open shared object file: No such file or directory
So it's not finding gnustep libs (gui in this case) it on its own, but when loaded via openapp it does. To confirm this I ran openapp with no arguments. It would spit out a message about its usage and exit, but should load gui and/or base. Sure enough, when I run that command I get the same 27 MB of diagnostic messages. So I tried running my program via opentool. Now I'm getting a segfault, this means it's running. I'll sort out the cause of the segfault but I'm puzzled as to why openapp and opentool seem to have this "linker independence".