www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 20244] New: New dmd option -preview=noXlinker does not work

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.

--
Sep 25 2019