September 26, 2019
https://issues.dlang.org/show_bug.cgi?id=20244

          Issue ID: 20244
           Summary: New dmd option -preview=noXlinker does not work on
                    Linux to build a simple D application
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody@puremagic.com
          Reporter: Alan.W.Irwin1234@gmail.com

I built dmd from git master branch HEAD today to evaluate this option, and unfortunately it failed on my first test which was as follows:

software@merlin> cat >main.d
import std.stdio;
void main()
{
    writeln("Hello, world without explicit compilations!");
}

Build and run the example without the -preview=noXlinker option to demonstrate my built version of dmd is working correctly without this flag for this source code

software@merlin> /home/software/dmd/install/linux/bin64/dmd main.d
software@merlin> ./main
Hello, world without explicit compilations!

Now attempt to build with the -preview=noXlinker option
software@merlin> /home/software/dmd/install/linux/bin64/dmd -preview=noXlinker
main.d
gcc: error: unrecognized command line option ‘--export-dynamic’; did you mean
‘-export-dynamic’?
Error: linker exited with status 1

Try again with more verbose output to see what the underlying gcc command is

software@merlin> /home/software/dmd/install/linux/bin64/dmd -preview=noXlinker
main.d -v
predefs   DigitalMars Posix linux ELFv1 CRuntime_Glibc CppRuntime_Gcc
LittleEndian D_Version2 all D_SIMD D_InlineAsm_X86_64 X86_64 D_LP64 D_PIC
assert D_ModuleInfo D_Exceptions D_TypeInfo D_HardFloat
binary    /home/software/dmd/install/linux/bin64/dmd
version   v2.088.0-238-g73f37547d
config    /home/software/dmd/install/linux/bin64/dmd.conf
DFLAGS    -I/home/software/dmd/install/linux/bin64/../../src/phobos
-I/home/software/dmd/install/linux/bin64/../../src/druntime/import
-L-L/home/software/dmd/install/linux/bin64/../lib64 -L--export-dynamic -fPIC
parse     main
importall main
import    object
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/object.d)
import    core.internal.hash
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/hash.d)
import    core.internal.traits
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/traits.d)
import    core.internal.convert
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/convert.d)
import    core.internal.entrypoint
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/entrypoint.d)
import    core.internal.array.appending
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/array/appending.d)
import    core.internal.array.comparison
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/array/comparison.d)
import    core.internal.array.equality
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/array/equality.d)
import    core.internal.array.casting
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/array/casting.d)
import    core.internal.array.concatenation
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/array/concatenation.d)
import    core.internal.array.construction
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/array/construction.d)
import    core.internal.array.capacity
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/array/capacity.d)
import    core.internal.dassert
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/dassert.d)
import    core.internal.destruction
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/destruction.d)
import    core.internal.moving
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/moving.d)
import    core.internal.postblit
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/postblit.d)
import    core.internal.switch_
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/switch_.d)
import    std.stdio
(/home/software/dmd/install/linux/bin64/../../src/phobos/std/stdio.d)
import    core.stdc.stddef
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/stdc/stddef.d)
import    std.algorithm.mutation
(/home/software/dmd/install/linux/bin64/../../src/phobos/std/algorithm/mutation.d)
import    std.traits
(/home/software/dmd/install/linux/bin64/../../src/phobos/std/traits.d)
import    std.meta
(/home/software/dmd/install/linux/bin64/../../src/phobos/std/meta.d)
import    std.range.primitives
(/home/software/dmd/install/linux/bin64/../../src/phobos/std/range/primitives.d)
import    std.functional
(/home/software/dmd/install/linux/bin64/../../src/phobos/std/functional.d)
import    std.typecons
(/home/software/dmd/install/linux/bin64/../../src/phobos/std/typecons.d)
import    std.format
(/home/software/dmd/install/linux/bin64/../../src/phobos/std/format.d)
import    core.vararg
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/vararg.d)
import    core.stdc.stdarg
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/stdc/stdarg.d)
import    core.stdc.stdlib
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/stdc/stdlib.d)
import    core.stdc.config
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/stdc/config.d)
import    std.exception
(/home/software/dmd/install/linux/bin64/../../src/phobos/std/exception.d)
import    std.internal.attributes
(/home/software/dmd/install/linux/bin64/../../src/phobos/std/internal/attributes.d)
import    core.stdc.stdio
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/stdc/stdio.d)
import    core.stdc.stdint
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/stdc/stdint.d)
import    core.stdc.signal
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/stdc/signal.d)
import    core.stdc.wchar_
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/stdc/wchar_.d)
import    core.stdc.time
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/stdc/time.d)
import    core.sys.posix.sys.types
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/sys/posix/sys/types.d)
import    core.sys.posix.config
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/sys/posix/config.d)
semantic  main
import    core.atomic
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/atomic.d)
import    core.internal.attributes
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/attributes.d)
import    core.internal.atomic
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/atomic.d)
import    core.stdc.errno
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/stdc/errno.d)
entry     main          main.d
semantic2 main
semantic3 main
import    std.utf
(/home/software/dmd/install/linux/bin64/../../src/phobos/std/utf.d)
import    core.exception
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/exception.d)
import    core.internal.string
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/internal/string.d)
import    std.algorithm.comparison
(/home/software/dmd/install/linux/bin64/../../src/phobos/std/algorithm/comparison.d)
import    core.stdc.string
(/home/software/dmd/install/linux/bin64/../../src/druntime/import/core/stdc/string.d)
code      main
function  D main
function  main._d_cmain!().main
function  std.stdio.writeln!string.writeln
function  std.stdio.File.LockingTextWriter.put!string.put
function  std.stdio.File.LockingTextWriter.put!string.put.__dgliteral2
function  std.stdio.trustedFwrite!char.trustedFwrite
function  std.exception.enforce!(ErrnoException).enforce!int.enforce
function  std.exception.bailOut!(ErrnoException).bailOut
function  object.idup!(const(char)).idup
function  object._trustedDup!(const(char), immutable(char))._trustedDup
function  object._dup!(const(char), immutable(char))._dup
function  object._doPostblit!(immutable(char))._doPostblit
function  object._getPostblit!(immutable(char))._getPostblit
function  std.stdio.File.LockingTextWriter.put!(immutable(char)).put
function
std.stdio.File.LockingTextWriter.put!(immutable(char)).put.trustedFPUTC
function
std.stdio.File.LockingTextWriter.put!(immutable(char)).put.trustedFPUTWC
function  std.stdio.File.LockingTextWriter.put!char.put
function  std.stdio.File.LockingTextWriter.put!char.put.trustedFPUTC
function  std.stdio.File.LockingTextWriter.put!char.put.trustedFPUTWC
gcc main.o -o main -m64 --export-dynamic
-L/home/software/dmd/install/linux/bin64/../lib64 -Xlinker -Bstatic -lphobos2
-Xlinker -Bdynamic -lpthread -lm -lrt -ldl
gcc: error: unrecognized command line option ‘--export-dynamic’; did you mean
‘-export-dynamic’?
Error: linker exited with status 1

Try that gcc command with -Xlinker in front of that --export-dynamic option

software@merlin> gcc main.o -o main -m64 -Xlinker --export-dynamic
-L/home/software/dmd/install/linux/bin64/../lib64 -Xlinker -Bstatic -lphobos2
-Xlinker -Bdynamic -lpthread -lm -lrt -ldl
software@merlin> ./main
Hello, world without explicit compilations!

I am pretty sure from these results that the implementation of this new option has a list of gcc flags that are internally generated by dmd on Linux that must have the -Xlinker option preceding them.  Obviously from the above results -Bstatic and -Bdynamic are on that list.  So it appears to me the fix for this issue would be to add --export-dynamic (note the two leading hyphens) to that list.

I really do need this flag so I hope this fix is given some priority.

--