Sitelet https://github.com/nodejs/node/issues/751
Skip to content

Windows: Broken node alias #751

Description

@kkoopa

The node compatibility link is unusable on windows. Addons depend on doing a callback to the specified executable module via node_module_register, which is not possible when the name is wrong.

If an addon depends on iojs.exe, it cannot be used through node.exe and vice versa, giving the 'Module did not self-register.' error.

node -e "require('./test/build/Release/addon')"
Error: Module did not self-register.

iojs -e "require('./test/build/Release/addon')"

Activity

  1. rvagg commented on Feb 7, 2015

    @rvagg
    Member

    /cc @piscisaureus

    do we need to do that stub executable after all?

  2. kkoopa commented on Feb 7, 2015

    @kkoopa
    Author

    Perhaps node.exe can spawn iojs.exe with the same command line arguments and redirected stdin, stdout and stderr?

  3. added a commit that references this issue on Feb 7, 2015
  4. added
    windowsIssues and PRs related to the Windows platform.
    on Feb 7, 2015
  5. piscisaureus commented on Feb 7, 2015

    @piscisaureus
    Contributor

    This issue is that the name of the library that compiled addons link against is fixed. For this reason it also has never been possible to rename node.exe on windows and have compiled addons still work.

    In theory this issue could be solved by delay-loading the symbols that come from iojs.exe and adding a delay-load notification hook to the compiled addon.

    Unfortunately I've never gotten around to implementing this.

    do we need to do that stub executable after all?

    The original plan I had where node.exe would "load" iojs.exe as a dynamic library turned out not to work.

    Perhaps node.exe can spawn iojs.exe with the same command line arguments and redirected stdin, stdout and stderr?

    That's possible but it I'm afraid it'll break other scripts that assume that they can obtain the PID for their child node process.
    At this point it also breaks clustering.

  6. kkoopa commented on Feb 7, 2015

    @kkoopa
    Author

    delayload might not work. It is not allowed to delay-load imported data, which happens when someone uses v8::String::ExternalStringResource which is a class exported from v8 with virtual members. Cannot link without the vtable.

    LINK : fatal error LNK1194: cannot delay-load 'iojs.exe' due to import of data symbol '"__declspec(dllimport) const v8::String::ExternalStringResource::`vftable'" (__imp_??_7ExternalStringResource@String@v8@@6B@)';
    link without /DELAYLOAD:iojs.exe
    
  7. piscisaureus commented on Feb 7, 2015

    @piscisaureus
    Contributor

    delayload might not work. It is not allowed to delay-load imported data, which happens when someone uses v8::String::ExternalStringResource which is a class exported from v8 with virtual members. Cannot link without the vtable.

    Right, I didn't think of that.
    I don't have any other ideas at this point.

  8. kkoopa commented on Feb 7, 2015

    @kkoopa
    Author

    Is it possible to break out all shared functionality into a real dynamic library, make addons link against that and have two thin frontends, "node.exe" and "iojs.exe"? Addons would then not necessarily be tied to executable names. If there still is a need for a registration callback inside the frontends then that can be found by dynamically loading the right library based on GetModuleFileName.

    In short: turn iojs.exe into iojs.dll, make new iojs.exe and node.exe as frontends for iojs.dll.

    node_main.cc could become the new iojs executable target by itself and the rest of iojs would become libiojs, now dynamically link iojs to libiojs and have addons link to libiojs. Now addons would no longer be dependent on the name of the main executable.

  9. kobalicek commented on Feb 8, 2015

    @kobalicek

    kkoopa: +1. I think this should have happened long time ago and I think I have filled an issue related to this already. I'm interested if there is anything I can help with.

  10. kobalicek commented on Feb 8, 2015

    @kobalicek

    I have filled this one, which is related: nodejs/roadmap#9

  11. added a commit that references this issue on Feb 8, 2015
  12. lidlanca commented on Feb 8, 2015

    @lidlanca

    Suggestion:

    Adding a symbolic link in the iojs_install_path
    node.exe <====> iojs.exe

    > cd iojs_install_path
    > mklink node.exe iojs.exe

    For systems that node and iojs need to co-exists, additional work around is needed.
    Prioritizing the iojs_install_path in the environmental PATH variable, when running iojs.exe. so it does not pick the original node binary on the system.

    Not sure if the suggestion will solve the issue @kkoopa reported.

    Edit:
    I noticed a case where a module build reference the node.lib in an external path ~/node-gyp
    and not iojs_install_path where I assume the installation will place it.

    I experimented on node-sqlite3 which did not build for me out of the box.
    The main issue was that it tried to reference ~.node-gyp\1.1.0\x64\node.lib, which does not exists.

    To resolve I added a symbolic link to the node.lib <== ==>iojs.lib in the proper ~.node-gyp path and patched node-sqlite3/package.json to support the 1.1.0 version.

    The result is a successful build with iojs on windows.

  13. Mithgol commented on Feb 17, 2015

    @Mithgol

    For future references, nodejs/node-gyp#564 is an attempt to fix this problem on build tools' level.

  14. added a commit that references this issue on Feb 17, 2015
  15. kkoopa commented on Feb 17, 2015

    @kkoopa
    Author

    This problem cannot be fixed from there. Addons have to register with the executable. If they depend on exports from iojs.exe, they cannot resolve them against node.exe and vice versa.

  16. 47 remaining items

  17. JCMais commented on Aug 14, 2015

    @JCMais
    Contributor

    Is this still a issue?

  18. justinmchase commented on Aug 14, 2015

    @justinmchase

    It does still exist unfortunately. It still exists specifically for apps that statically link to node but have a different executable name, e.g. electron.exe, nw.exe, etc.

    The delay load hook hack is a way to work around it. I have a PR out for node-gyp which would fix it automatically for everyone, I believe:
    nodejs/node-gyp#653

    This would allow embedders to ship their own build of node.dll and automatically get compatibility with native modules compiled against node. Node would not have to ship a node.dll, embedders could optionally do it to get compatibility.

  19. Fishrock123 commented on Aug 27, 2015

    @Fishrock123
    Contributor

    This won't be an issue in the converged 4.0.0 release. Since it's impractical to address in io.js (1.0.0> <4.0.0), I'm going to close this.

  20. added a commit that references this issue on Oct 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    windowsIssues and PRs related to the Windows platform.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions