mswin: Add statically linked extension exports to the import library - #18670
Merged
Conversation
The def file is generated from $(LIBRUBY_A) alone, so a symbol that a statically linked extension exports with RUBY_FUNC_EXPORTED reaches the DLL through its own linker directive but never reaches the import library, and an extension built later against that ruby cannot link it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
On mswin an extension built against a
--with-static-linked-extruby fails to link witherror LNK2019: unresolved external symbol rb_digest_wrap_metadata, although the shipped DLL does export it.config.hdefinesEXTSTATICfor such a build, soruby/digest.hmakes every digest-based extension refer to that symbol directly.The def file is generated from
$(LIBRUBY_A)alone. Whatever a statically linked extension exports withRUBY_FUNC_EXPORTEDtherefore reaches the DLL through its own/EXPORT:linker directive, but never reaches the import library that ships next to it.win32/mkexports.rbnow also reads those directives from the files listed after--, and$(RUBYDEF)passes$(DLDOBJS)there.Only explicit exports are collected, so the DLL's export table does not change and the dynamic build still produces a byte-identical def file. Reproducing the failure needs ruby/digest#152, without which
--with-static-linked-extdoes not compile on MSVC.Generated with Claude Code