Skip to content

Error: Multiple occurences of sentinel found in the binary #92

Description

@istir

Hello,
I'm trying to build a single executable app and encountered this problem:

➜ echo 'console.log(`Hello, ${process.argv[2]}!`);' > hello.js
➜ echo '{ "main": "hello.js", "output": "sea-prep.blob" }' > sea-config.json
➜ node --experimental-sea-config sea-config.json
Wrote single executable preparation blob to sea-prep.blob
➜ cp $(command -v node) hello
➜ codesign --remove-signature hello
➜ npx postject hello NODE_SEA_BLOB sea-prep.blob \
    --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 \
    --macho-segment-name NODE_SEA
Start injection of NODE_SEA_BLOB in hello...
Error: Multiple occurences of sentinel "NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2" found in the binary

I also tried with pnpx instead of npx.
Some information about my environment:

➜ uname -a 
Darwin istirs-Air.lan 23.2.0 Darwin Kernel Version 23.2.0: Wed Nov 15 21:53:34 PST 2023; root:xnu-10002.61.3~2/RELEASE_ARM64_T8103 arm64
➜ node -v 
v21.5.0
➜ npx -v 
10.2.4

Activity

  1. bulentv commented on Jan 5, 2024

    @bulentv

    Same on Darwin 23.1.0 with node v21.5.0, injection fails.

    I also tested v22.0.0-nightly20240104084d761dfc, which injection appears to be succeeded but the produced binary still doesn't work.

    ...
    ➜ npx postject hello NODE_SEA_BLOB sea-prep.blob \
        --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 \
        --macho-segment-name NODE_SEA
    npm WARN cli npm v10.2.4 does not support Node.js v22.0.0-nightly20240104084d761dfc. This version of npm supports the following node versions: `^18.17.0 || >=20.5.0`. You can find the latest version at https://nodejs.org/.
    Start injection of NODE_SEA_BLOB in hello...
    💉 Injection done!
    ➜ ./hello world
    zsh: killed     ./hello world
    
  2. targos commented on Jan 5, 2024

    @targos
    Member

    @nodejs/single-executable

  3. cceevv commented on May 7, 2024

    @cceevv

    .../postject/dist/api.js

    ...
    
      const buffer = Buffer.from(data.buffer);
      const firstSentinel = buffer.indexOf(sentinelFuse);
      if (firstSentinel === -1) {
        throw new Error(
          `Could not find the sentinel ${sentinelFuse} in the binary`
        );
      }
      const lastSentinel = buffer.lastIndexOf(sentinelFuse);
      // if (firstSentinel !== lastSentinel) {
      //   throw new Error(
      //     `Multiple occurences of sentinel "${sentinelFuse}" found in the binary`
      //   );
      // }
      const colonIndex = firstSentinel + sentinelFuse.length;
      if (buffer[colonIndex] !== ":".charCodeAt(0)) {
        throw new Error(
          `Value at index ${colonIndex} must be ':' but '${buffer[colonIndex].charCodeAt(0)}' was found`
        );
      }
    
    ...
    

    I tried to comments the Error lines, and everything works.

  4. guymguym commented on Jul 25, 2024

    @guymguym

    Same for me on MacOS 14.5 with M1 cpu, Darwin Kernel Version 23.5.0.
    Tried both with nodejs 20.16.0 and 22.5.1.

    in sea-config.json I have:

    {
      "main": "build/sea.js",
      "output": "build/sea.blob",
      "disableExperimentalSEAWarning": true,
      "useSnapshot": false,
      "useCodeCache": false,
      "assets": {}
    }
  5. Patrick-Beuks commented on Aug 12, 2024

    @Patrick-Beuks

    I had the same problem, but found the bug and have a workaround. For me the problem was that I had the sentinel fuse inside of the package.json and this was included in the blob. This in turn confuses if (firstSentinel !== lastSentinel) { as this is indeed not true, even if the that fuse was not used.

    I fixed it by base64 encoding the string and in the command decode it before using

  6. gauntface commented on Feb 10, 2025

    @gauntface

    I'm running into this issue and looking out the output and blob of my script, I don't have the sentinel referenced anywhere.

    EDIT: I was wrong, the sentinel is in the node binary before calling postject.

    [Arg = std::string_view &, Args = <const char *, unsigned long>]�NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2:0�Cannot read single executable configuration from %s

    I've tested on v20 and v23 of node and get the same error with postject

  7. gauntface commented on Feb 10, 2025

    @gauntface

    I just tried using an installation of node done via nvm and the injection was successful.

    NOTE: I am on mac OS

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions