Jump to page: 1 2
Thread overview
Building application with LDC and -flto=thin fails in link stage
Mar 26, 2018
Nordlöw
Mar 26, 2018
Johan Engelen
Mar 26, 2018
Nordlöw
Mar 27, 2018
kinke
Mar 27, 2018
Johan Engelen
Mar 27, 2018
Per Nordlöw
Mar 28, 2018
Johan Engelen
Mar 28, 2018
Seb
Mar 28, 2018
Johan Engelen
Mar 29, 2018
Jacob Carlborg
Mar 30, 2018
Johan Engelen
Mar 30, 2018
Johan Engelen
Mar 27, 2018
Arek
March 26, 2018
When I try build my application using LDC and -flto=thin it fails in the final linking as

ldmd2 -of.dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-9FDE475789CA2E324E9DAE6A959C2B7F/knetquery .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-9FDE475789CA2E324E9DAE6A959C2B7F/knetquery.o ../../.dub/packages/gmp-d-master/gmp-d/.dub/build/library-release-nobounds-lto-linux.posix-x86_64-ldc_2078-0CE08DAF93E48445402E07C3537FA4E6/libgmp-d.a phobos-next/.dub/build/library-release-nobounds-lto-linux.posix-x86_64-ldc_2078-933571CC843E8D13926CEC14051E7195/libknet_phobos-next.a -L--no-as-needed -L-lzstd -L-lgmp -L-lc -L-lreadline -L-lz -L-lbz2
/usr/bin/ld: error: .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-9FDE475789CA2E324E9DAE6A959C2B7F/knetquery.o:1:3: invalid character
/usr/bin/ld: error: .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-9FDE475789CA2E324E9DAE6A959C2B7F/knetquery.o:1:3: syntax error, unexpected $end
/usr/bin/ld: error: .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-9FDE475789CA2E324E9DAE6A959C2B7F/knetquery.o: not an object or archive
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o:function _start: error: undefined reference to 'main'
collect2: error: ld returned 1 exit status
Error: /usr/bin/gcc failed with status: 1
FAIL .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-9FDE475789CA2E324E9DAE6A959C2B7F/ knetquery executable
ldmd2 failed with exit code 1.

What could be wrong?
March 26, 2018
On Monday, 26 March 2018 at 22:07:49 UTC, Nordlöw wrote:
> When I try build my application using LDC and -flto=thin it fails in the final linking

You must also pass `-flto=thin` during linking (a special plugin is needed for LTO, and LDC will only pass the plugin to the linker when `-flto=` is specified).
I couldn't see `-flto=thin` in your link command, so I suspect that will fix it.

- Johan

March 26, 2018
On Monday, 26 March 2018 at 22:13:02 UTC, Johan Engelen wrote:
> On Monday, 26 March 2018 at 22:07:49 UTC, Nordlöw wrote:
>> When I try build my application using LDC and -flto=thin it fails in the final linking
>
> You must also pass `-flto=thin` during linking (a special plugin is needed for LTO, and LDC will only pass the plugin to the linker when `-flto=` is specified).
> I couldn't see `-flto=thin` in your link command, so I suspect that will fix it.
>
> - Johan

I added `lflags` to my dub configuration as

buildType "release-nobounds-lto" {
         buildOptions "releaseMode" "optimize" "inline" "noBoundsCheck" # TODO -march=native -ffast-math
         dflags "-mcpu=native" "-O3" "-flto=thin" platform="posix-ldc"
         lflags "-flto=thin" platform="posix-ldc"
}

forwarded as `-L-flto=thin` but still errors as

Linking...
ldmd2 -of.dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery.o ../../.dub/packages/gmp-d-master/gmp-d/.dub/build/library-release-nobounds-lto-linux.posix-x86_64-ldc_2078-B287F67CE5FF6145BC229790CFB09607/libgmp-d.a phobos-next/.dub/build/library-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F0F2FDB01B8401C04D657BCC145D46A5/libknet_phobos-next.a -L--no-as-needed -L-flto=thin -L-lzstd -L-lgmp -L-lc -L-lreadline -L-lz -L-lbz2
/usr/bin/ld: error: .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery.o:1:3: invalid character
/usr/bin/ld: error: .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery.o:1:3: syntax error, unexpected $end
/usr/bin/ld: error: .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery.o: not an object or archive
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o:function _start: error: undefined reference to 'main'
collect2: error: ld returned 1 exit status
Error: /usr/bin/gcc failed with status: 1
FAIL .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/ knetquery executable
ldmd2 failed with exit code 1.

March 27, 2018
On Monday, 26 March 2018 at 22:07:49 UTC, Nordlöw wrote:
> When I try build my application using LDC and -flto=thin it fails in the final linking as
>

According to LDC's Release info:

Known issues:
ThinLTO may not work well with the ld.bfd linker, use ld.gold instead (-linker=gold).


Maybe this is the problem.

Arek

March 27, 2018
On Monday, 26 March 2018 at 23:32:59 UTC, Nordlöw wrote:
> forwarded as `-L-flto=thin` but still errors as

Which is wrong, it's not a ld command-line option (i.e., the `-L` prefix is wrong). I don't use dub though, so I don't know how to fix it.
March 27, 2018
On Tuesday, 27 March 2018 at 13:28:08 UTC, kinke wrote:
> On Monday, 26 March 2018 at 23:32:59 UTC, Nordlöw wrote:
>> forwarded as `-L-flto=thin` but still errors as
>
> Which is wrong, it's not a ld command-line option (i.e., the `-L` prefix is wrong).

Indeed.
Please try to manually link first (without dub) by modifying the command on which dub errors:

```
ldmd2 -flto=thin -of.dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery.o ../../.dub/packages/gmp-d-master/gmp-d/.dub/build/library-release-nobounds-lto-linux.posix-x86_64-ldc_2078-B287F67CE5FF6145BC229790CFB09607/libgmp-d.a phobos-next/.dub/build/library-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F0F2FDB01B8401C04D657BCC145D46A5/libknet_phobos-next.a -L--no-as-needed -L-lzstd -L-lgmp -L-lc -L-lreadline -L-lz -L-lbz2
```

-Johan
March 27, 2018
On Tuesday, 27 March 2018 at 22:00:42 UTC, Johan Engelen wrote:
> Indeed.
> Please try to manually link first (without dub) by modifying the command on which dub errors:
>
> ```
> ldmd2 -flto=thin -of.dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery.o ../../.dub/packages/gmp-d-master/gmp-d/.dub/build/library-release-nobounds-lto-linux.posix-x86_64-ldc_2078-B287F67CE5FF6145BC229790CFB09607/libgmp-d.a phobos-next/.dub/build/library-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F0F2FDB01B8401C04D657BCC145D46A5/libknet_phobos-next.a -L--no-as-needed -L-lzstd -L-lgmp -L-lc -L-lreadline -L-lz -L-lbz2
> ```
>
> -Johan

Yes, that works!
March 28, 2018
On Tuesday, 27 March 2018 at 22:10:33 UTC, Per Nordlöw wrote:
> On Tuesday, 27 March 2018 at 22:00:42 UTC, Johan Engelen wrote:
>> Indeed.
>> Please try to manually link first (without dub) by modifying the command on which dub errors:
>>
>> ```
>> ldmd2 -flto=thin -of.dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery.o ../../.dub/packages/gmp-d-master/gmp-d/.dub/build/library-release-nobounds-lto-linux.posix-x86_64-ldc_2078-B287F67CE5FF6145BC229790CFB09607/libgmp-d.a phobos-next/.dub/build/library-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F0F2FDB01B8401C04D657BCC145D46A5/libknet_phobos-next.a -L--no-as-needed -L-lzstd -L-lgmp -L-lc -L-lreadline -L-lz -L-lbz2
>> ```
>>
>> -Johan
>
> Yes, that works!

Good :-)

I'm no dub expert and I don't know how to pass flags to the _compiler_ for the link step.
Would be good to figure that out with the dub folks.

There will be similar problems with using ASan (and fuzzer aswell):  `-fsanitize=address` must also be passed to the D compiler (not the linker) during linking such that the correct asan library is linked into the executable.

- Johan

March 28, 2018
On Wednesday, 28 March 2018 at 16:42:23 UTC, Johan Engelen wrote:
> On Tuesday, 27 March 2018 at 22:10:33 UTC, Per Nordlöw wrote:
>> On Tuesday, 27 March 2018 at 22:00:42 UTC, Johan Engelen wrote:
>>> Indeed.
>>> Please try to manually link first (without dub) by modifying the command on which dub errors:
>>>
>>> ```
>>> ldmd2 -flto=thin -of.dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery .dub/build/application-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F2904BE3C4DA237C077E5C2B0B23442E/knetquery.o ../../.dub/packages/gmp-d-master/gmp-d/.dub/build/library-release-nobounds-lto-linux.posix-x86_64-ldc_2078-B287F67CE5FF6145BC229790CFB09607/libgmp-d.a phobos-next/.dub/build/library-release-nobounds-lto-linux.posix-x86_64-ldc_2078-F0F2FDB01B8401C04D657BCC145D46A5/libknet_phobos-next.a -L--no-as-needed -L-lzstd -L-lgmp -L-lc -L-lreadline -L-lz -L-lbz2
>>> ```
>>>
>>> -Johan
>>
>> Yes, that works!
>
> Good :-)
>
> I'm no dub expert and I don't know how to pass flags to the _compiler_ for the link step.
> Would be good to figure that out with the dub folks.
>
> There will be similar problems with using ASan (and fuzzer aswell):  `-fsanitize=address` must also be passed to the D compiler (not the linker) during linking such that the correct asan library is linked into the executable.
>
> - Johan

dub supports dflags and lflags in the config file. lflags are the linker commands.

http://code.dlang.org/package-format?lang=sdl#build-settings

You can also specify per platform arguments, e.g.

dflags "-version=BuildingWithLDCRocks" platform="ldc"

(dub even supports the environment variables DFLAGS which dmd doesn't (and of course LFLAGS))
March 28, 2018
On Wednesday, 28 March 2018 at 17:03:07 UTC, Seb wrote:
> 
> dub supports dflags and lflags in the config file. lflags are the linker commands.

Please read the thread.

`lflags` is for passing flags to the _linker_ (i.e. those flags are prefixed with -L when passed to the _compiler_)

Here, what's needed is passing flags to the _compiler_ when it is invoked to perform the link step in the build.

-Johan

« First   ‹ Prev
1 2