D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 17216 - OSX: `rdmd -shared -oflibfun.dylib fun.d` and otool -L libfun.dylib points to libfun.dylib.tmp
Summary: OSX: `rdmd -shared -oflibfun.dylib fun.d` and otool -L libfun.dylib points to...
Status: RESOLVED MOVED
Alias: None
Product: D
Classification: Unclassified
Component: tools (show other issues)
Version: D2
Hardware: x86 Mac OS X
: P1 regression
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-02-21 05:06 UTC by Timothee Cour
Modified: 2020-06-04 16:58 UTC (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Timothee Cour 2017-02-21 05:06:39 UTC
v2.072.2
rdmd build 20170108

fun.d:whatever

rdmd -v --force --build-only -shared -oflibfun.dylib fun.d
creates libfun.dylib

otool -L libfun.dylib
libfun.dylib:
        libfun.dylib.tmp (compatibility version 0.0.0, current version 0.0.0)


libfun.dylib.tmp is wrong, and will cause errors when linking via `-lfun`, eg:
`dyld: Library not loaded: libfun.dylib.tmp`

This used to work on OSX (and works on linux)
Comment 1 Timothee Cour 2017-02-21 05:17:26 UTC
same with latest:
DMD64 D Compiler v2.073.1
rdmd build 20170220
Comment 2 Timothee Cour 2017-02-21 05:33:14 UTC
workaround:
`-L-install_name -Llibfun.dylib`
Comment 3 Andrew 2017-05-07 13:44:23 UTC
This is still occurring in HEAD.

When rdmd calls dmd it gives an output name that ends with ".tmp" (https://github.com/dlang/tools/blob/master/rdmd.d#L483-L488) and that is what dmd passes to clang (used for linking under OSX). As the install_name arg isn't given thats what ends up being the install_name of the dylib and hence this problem.

There are two obvious ways of fixing it - get dmd to call clang with install_name or run install_name_tool after building.

Neither seem obviously great - IIUC rdmd doesn't know its building a shared library so doesn't know install_name is important. dmd does know but isn't aware that rdmd has passed it a dummy output name that will later get mv'ed to the final name.

I don't yet know if rdmd _needs_ to use the .tmp then mv trick but I'm guessing its there to cope with some sort of error on some platform - if that could be avoided the problem would disappear. Anything else seems to require rdmd learning about shared libraries under OSX or dmd having more awareness of rdmd.
Comment 4 Andrew 2017-05-07 13:49:35 UTC
OK .tmp is added at https://github.com/dlang/tools/commit/085dc5d000b828be9a3c2dc79548352f63b52db4 to work around a Windows problem so removing it without an alternative wouldn't be good.
Comment 5 Andrew 2017-05-07 14:29:52 UTC
I now have a fix at https://github.com/cqexbesd/tools/tree/dlang_17216.

It's not great - it just makes the windows work around only happen under Windows.

Given https://github.com/cqexbesd/tools/blob/d27bcc1228863ba0a3b0ae5cf47a8d3a409bda45/rdmd.d#L461-L481 however I'm not sure that the windows workaround should still be needed. The rm code didn't exist when the workaround was added AFAIK. I might try removing the workaround and finding a windows user who can test it.
Comment 6 Andrew 2017-05-07 14:37:38 UTC
Second proposed fix (removing the use of .tmp altogether) is at https://github.com/cqexbesd/tools/tree/dlang_17216_v2. I don't have a copy of Windows so it needs testing - but it works under OSX.
Comment 7 Mathias LANG 2020-06-04 16:58:51 UTC
This issue has been moved to https://github.com/dlang/tools/issues/406