linux x64 release binary fails to exec on WSL1 #63735

Description

@deepak1556

Version

v24.16.0 (also reproduces on every v23.x and v24.x release; does not reproduce on v22.x)

Platform

Any **WSL1** distro. WSL2 is unaffected.

Subsystem

No response

What steps will reproduce the bug?

curl -LO https://nodejs.org/dist/v24.16.0/node-v24.16.0-linux-x64.tar.gz
tar xf node-v24.16.0-linux-x64.tar.gz
./node-v24.16.0-linux-x64/bin/node --version

How often does it reproduce? Is there a required condition?

Always, needs WSL1 distro

What is the expected behavior? Why is that the expected behavior?

node should exec and run normally on WSL1, as it did on v22.x. The 2MB p_align carries no runtime benefit for the Node executable today:

  • Current executable is of type ET_EXEC with fixed p_vaddr. The kernel maps each PT_LOAD at its hard-coded address.
  • The --use-largepages feature performs its hugepage remap at runtime; it never reads p_align.

So the lpstubPT_LOAD advertising p_align = 0x200000 is unnecessary, and clamping it to the page size (0x1000) is behavior-neutral for the runtime while restoring WSL1 compatibility.

What do you see instead?

cannot execute binary file: Exec format error

Additional information

The linux x64 binary ships a PT_LOAD segment (containing the lpstub section used by the --use-largepages feature) whose p_align is 2 MB:

# readelf -lW node-v24.16.0 (offending segment)
Type Offset VirtAddr ... Flg Align
LOAD 0x2c00000 0x0000000003000000 ... R E 0x200000 <-- p_align = 2 MiB

#16198 introduced the section alignment (sh_addralign) for the code mover and its been there for a while. The regression started recently where the program headers started respecting it due to toolchain bump,

NodeOfficial linux-x64 toolchainGNU ldlpstub segment p_align
v22.xRHEL 8 with gcc-toolset-10binutils 2.350x1000 (works on WSL1)
v23.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)
v24.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)

binutils commit 74e315dbfe5, first released in binutils 2.38 added a code path in assign_file_positions_for_load_sections that, for a section whose alignment
exceeds maxpagesize (on x86-64 maxpagesize is 0x1000), stamps the segment's p_align to the section alignment. Under binutils 2.35 the segment's p_align was unconditionally maxpagesize (0x1000).

Kernel 5.10+ ce81bb256a22 respects the large p_align segment values for PIE binaries but it doesn't do any rejection in other cases. However, WSL1's binfmt_elf seems to reject any PT_LOAD whose p_align exceeds the system page size.

WSL is not a Tier 1 platform, thought I would raise this here for awareness and if there was interest to have a link time fix after seeing microsoft/WSL#8151. For VSCode remote server where I encountered this, applied a similar solution https://github.com/microsoft/vscode/pull/319355/changes

Activity

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

    buildIssues and PRs related to Node.js builds or CI infrastructure.windowsIssues and PRs related to the Windows platform.wslIssues and PRs related to the Windows Subsystem for Linux.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      linux x64 release binary fails to exec on WSL1 #63735

      Description

      @deepak1556

      Version

      v24.16.0 (also reproduces on every v23.x and v24.x release; does not reproduce on v22.x)

      Platform

      Any **WSL1** distro. WSL2 is unaffected.
      

      Subsystem

      No response

      What steps will reproduce the bug?

      curl -LO https://nodejs.org/dist/v24.16.0/node-v24.16.0-linux-x64.tar.gz
      tar xf node-v24.16.0-linux-x64.tar.gz
      ./node-v24.16.0-linux-x64/bin/node --version

      How often does it reproduce? Is there a required condition?

      Always, needs WSL1 distro

      What is the expected behavior? Why is that the expected behavior?

      node should exec and run normally on WSL1, as it did on v22.x. The 2MB p_align carries no runtime benefit for the Node executable today:

      • Current executable is of type ET_EXEC with fixed p_vaddr. The kernel maps each PT_LOAD at its hard-coded address.
      • The --use-largepages feature performs its hugepage remap at runtime; it never reads p_align.

      So the lpstubPT_LOAD advertising p_align = 0x200000 is unnecessary, and clamping it to the page size (0x1000) is behavior-neutral for the runtime while restoring WSL1 compatibility.

      What do you see instead?

      cannot execute binary file: Exec format error

      Additional information

      The linux x64 binary ships a PT_LOAD segment (containing the lpstub section used by the --use-largepages feature) whose p_align is 2 MB:

      # readelf -lW node-v24.16.0 (offending segment)
      Type Offset VirtAddr ... Flg Align
      LOAD 0x2c00000 0x0000000003000000 ... R E 0x200000 <-- p_align = 2 MiB
      

      #16198 introduced the section alignment (sh_addralign) for the code mover and its been there for a while. The regression started recently where the program headers started respecting it due to toolchain bump,

      NodeOfficial linux-x64 toolchainGNU ldlpstub segment p_align
      v22.xRHEL 8 with gcc-toolset-10binutils 2.350x1000 (works on WSL1)
      v23.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)
      v24.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)

      binutils commit 74e315dbfe5, first released in binutils 2.38 added a code path in assign_file_positions_for_load_sections that, for a section whose alignment
      exceeds maxpagesize (on x86-64 maxpagesize is 0x1000), stamps the segment's p_align to the section alignment. Under binutils 2.35 the segment's p_align was unconditionally maxpagesize (0x1000).

      Kernel 5.10+ ce81bb256a22 respects the large p_align segment values for PIE binaries but it doesn't do any rejection in other cases. However, WSL1's binfmt_elf seems to reject any PT_LOAD whose p_align exceeds the system page size.

      WSL is not a Tier 1 platform, thought I would raise this here for awareness and if there was interest to have a link time fix after seeing microsoft/WSL#8151. For VSCode remote server where I encountered this, applied a similar solution https://github.com/microsoft/vscode/pull/319355/changes

      Activity

      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

        buildIssues and PRs related to Node.js builds or CI infrastructure.windowsIssues and PRs related to the Windows platform.wslIssues and PRs related to the Windows Subsystem for Linux.

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          linux x64 release binary fails to exec on WSL1 #63735

          Description

          @deepak1556

          Version

          v24.16.0 (also reproduces on every v23.x and v24.x release; does not reproduce on v22.x)

          Platform

          Any **WSL1** distro. WSL2 is unaffected.
          

          Subsystem

          No response

          What steps will reproduce the bug?

          curl -LO https://nodejs.org/dist/v24.16.0/node-v24.16.0-linux-x64.tar.gz
          tar xf node-v24.16.0-linux-x64.tar.gz
          ./node-v24.16.0-linux-x64/bin/node --version

          How often does it reproduce? Is there a required condition?

          Always, needs WSL1 distro

          What is the expected behavior? Why is that the expected behavior?

          node should exec and run normally on WSL1, as it did on v22.x. The 2MB p_align carries no runtime benefit for the Node executable today:

          • Current executable is of type ET_EXEC with fixed p_vaddr. The kernel maps each PT_LOAD at its hard-coded address.
          • The --use-largepages feature performs its hugepage remap at runtime; it never reads p_align.

          So the lpstubPT_LOAD advertising p_align = 0x200000 is unnecessary, and clamping it to the page size (0x1000) is behavior-neutral for the runtime while restoring WSL1 compatibility.

          What do you see instead?

          cannot execute binary file: Exec format error

          Additional information

          The linux x64 binary ships a PT_LOAD segment (containing the lpstub section used by the --use-largepages feature) whose p_align is 2 MB:

          # readelf -lW node-v24.16.0 (offending segment)
          Type Offset VirtAddr ... Flg Align
          LOAD 0x2c00000 0x0000000003000000 ... R E 0x200000 <-- p_align = 2 MiB
          

          #16198 introduced the section alignment (sh_addralign) for the code mover and its been there for a while. The regression started recently where the program headers started respecting it due to toolchain bump,

          NodeOfficial linux-x64 toolchainGNU ldlpstub segment p_align
          v22.xRHEL 8 with gcc-toolset-10binutils 2.350x1000 (works on WSL1)
          v23.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)
          v24.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)

          binutils commit 74e315dbfe5, first released in binutils 2.38 added a code path in assign_file_positions_for_load_sections that, for a section whose alignment
          exceeds maxpagesize (on x86-64 maxpagesize is 0x1000), stamps the segment's p_align to the section alignment. Under binutils 2.35 the segment's p_align was unconditionally maxpagesize (0x1000).

          Kernel 5.10+ ce81bb256a22 respects the large p_align segment values for PIE binaries but it doesn't do any rejection in other cases. However, WSL1's binfmt_elf seems to reject any PT_LOAD whose p_align exceeds the system page size.

          WSL is not a Tier 1 platform, thought I would raise this here for awareness and if there was interest to have a link time fix after seeing microsoft/WSL#8151. For VSCode remote server where I encountered this, applied a similar solution https://github.com/microsoft/vscode/pull/319355/changes

          Activity

          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

            buildIssues and PRs related to Node.js builds or CI infrastructure.windowsIssues and PRs related to the Windows platform.wslIssues and PRs related to the Windows Subsystem for Linux.

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              linux x64 release binary fails to exec on WSL1 #63735

              Description

              @deepak1556

              Version

              v24.16.0 (also reproduces on every v23.x and v24.x release; does not reproduce on v22.x)

              Platform

              Any **WSL1** distro. WSL2 is unaffected.
              

              Subsystem

              No response

              What steps will reproduce the bug?

              curl -LO https://nodejs.org/dist/v24.16.0/node-v24.16.0-linux-x64.tar.gz
              tar xf node-v24.16.0-linux-x64.tar.gz
              ./node-v24.16.0-linux-x64/bin/node --version

              How often does it reproduce? Is there a required condition?

              Always, needs WSL1 distro

              What is the expected behavior? Why is that the expected behavior?

              node should exec and run normally on WSL1, as it did on v22.x. The 2MB p_align carries no runtime benefit for the Node executable today:

              • Current executable is of type ET_EXEC with fixed p_vaddr. The kernel maps each PT_LOAD at its hard-coded address.
              • The --use-largepages feature performs its hugepage remap at runtime; it never reads p_align.

              So the lpstubPT_LOAD advertising p_align = 0x200000 is unnecessary, and clamping it to the page size (0x1000) is behavior-neutral for the runtime while restoring WSL1 compatibility.

              What do you see instead?

              cannot execute binary file: Exec format error

              Additional information

              The linux x64 binary ships a PT_LOAD segment (containing the lpstub section used by the --use-largepages feature) whose p_align is 2 MB:

              # readelf -lW node-v24.16.0 (offending segment)
              Type Offset VirtAddr ... Flg Align
              LOAD 0x2c00000 0x0000000003000000 ... R E 0x200000 <-- p_align = 2 MiB
              

              #16198 introduced the section alignment (sh_addralign) for the code mover and its been there for a while. The regression started recently where the program headers started respecting it due to toolchain bump,

              NodeOfficial linux-x64 toolchainGNU ldlpstub segment p_align
              v22.xRHEL 8 with gcc-toolset-10binutils 2.350x1000 (works on WSL1)
              v23.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)
              v24.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)

              binutils commit 74e315dbfe5, first released in binutils 2.38 added a code path in assign_file_positions_for_load_sections that, for a section whose alignment
              exceeds maxpagesize (on x86-64 maxpagesize is 0x1000), stamps the segment's p_align to the section alignment. Under binutils 2.35 the segment's p_align was unconditionally maxpagesize (0x1000).

              Kernel 5.10+ ce81bb256a22 respects the large p_align segment values for PIE binaries but it doesn't do any rejection in other cases. However, WSL1's binfmt_elf seems to reject any PT_LOAD whose p_align exceeds the system page size.

              WSL is not a Tier 1 platform, thought I would raise this here for awareness and if there was interest to have a link time fix after seeing microsoft/WSL#8151. For VSCode remote server where I encountered this, applied a similar solution https://github.com/microsoft/vscode/pull/319355/changes

              Activity

              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

                buildIssues and PRs related to Node.js builds or CI infrastructure.windowsIssues and PRs related to the Windows platform.wslIssues and PRs related to the Windows Subsystem for Linux.

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  linux x64 release binary fails to exec on WSL1 #63735

                  Description

                  @deepak1556

                  Version

                  v24.16.0 (also reproduces on every v23.x and v24.x release; does not reproduce on v22.x)

                  Platform

                  Any **WSL1** distro. WSL2 is unaffected.
                  

                  Subsystem

                  No response

                  What steps will reproduce the bug?

                  curl -LO https://nodejs.org/dist/v24.16.0/node-v24.16.0-linux-x64.tar.gz
                  tar xf node-v24.16.0-linux-x64.tar.gz
                  ./node-v24.16.0-linux-x64/bin/node --version

                  How often does it reproduce? Is there a required condition?

                  Always, needs WSL1 distro

                  What is the expected behavior? Why is that the expected behavior?

                  node should exec and run normally on WSL1, as it did on v22.x. The 2MB p_align carries no runtime benefit for the Node executable today:

                  • Current executable is of type ET_EXEC with fixed p_vaddr. The kernel maps each PT_LOAD at its hard-coded address.
                  • The --use-largepages feature performs its hugepage remap at runtime; it never reads p_align.

                  So the lpstubPT_LOAD advertising p_align = 0x200000 is unnecessary, and clamping it to the page size (0x1000) is behavior-neutral for the runtime while restoring WSL1 compatibility.

                  What do you see instead?

                  cannot execute binary file: Exec format error

                  Additional information

                  The linux x64 binary ships a PT_LOAD segment (containing the lpstub section used by the --use-largepages feature) whose p_align is 2 MB:

                  # readelf -lW node-v24.16.0 (offending segment)
                  Type Offset VirtAddr ... Flg Align
                  LOAD 0x2c00000 0x0000000003000000 ... R E 0x200000 <-- p_align = 2 MiB
                  

                  #16198 introduced the section alignment (sh_addralign) for the code mover and its been there for a while. The regression started recently where the program headers started respecting it due to toolchain bump,

                  NodeOfficial linux-x64 toolchainGNU ldlpstub segment p_align
                  v22.xRHEL 8 with gcc-toolset-10binutils 2.350x1000 (works on WSL1)
                  v23.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)
                  v24.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)

                  binutils commit 74e315dbfe5, first released in binutils 2.38 added a code path in assign_file_positions_for_load_sections that, for a section whose alignment
                  exceeds maxpagesize (on x86-64 maxpagesize is 0x1000), stamps the segment's p_align to the section alignment. Under binutils 2.35 the segment's p_align was unconditionally maxpagesize (0x1000).

                  Kernel 5.10+ ce81bb256a22 respects the large p_align segment values for PIE binaries but it doesn't do any rejection in other cases. However, WSL1's binfmt_elf seems to reject any PT_LOAD whose p_align exceeds the system page size.

                  WSL is not a Tier 1 platform, thought I would raise this here for awareness and if there was interest to have a link time fix after seeing microsoft/WSL#8151. For VSCode remote server where I encountered this, applied a similar solution https://github.com/microsoft/vscode/pull/319355/changes

                  Activity

                  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

                    buildIssues and PRs related to Node.js builds or CI infrastructure.windowsIssues and PRs related to the Windows platform.wslIssues and PRs related to the Windows Subsystem for Linux.

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      linux x64 release binary fails to exec on WSL1 #63735

                      Description

                      @deepak1556

                      Version

                      v24.16.0 (also reproduces on every v23.x and v24.x release; does not reproduce on v22.x)

                      Platform

                      Any **WSL1** distro. WSL2 is unaffected.
                      

                      Subsystem

                      No response

                      What steps will reproduce the bug?

                      curl -LO https://nodejs.org/dist/v24.16.0/node-v24.16.0-linux-x64.tar.gz
                      tar xf node-v24.16.0-linux-x64.tar.gz
                      ./node-v24.16.0-linux-x64/bin/node --version

                      How often does it reproduce? Is there a required condition?

                      Always, needs WSL1 distro

                      What is the expected behavior? Why is that the expected behavior?

                      node should exec and run normally on WSL1, as it did on v22.x. The 2MB p_align carries no runtime benefit for the Node executable today:

                      • Current executable is of type ET_EXEC with fixed p_vaddr. The kernel maps each PT_LOAD at its hard-coded address.
                      • The --use-largepages feature performs its hugepage remap at runtime; it never reads p_align.

                      So the lpstubPT_LOAD advertising p_align = 0x200000 is unnecessary, and clamping it to the page size (0x1000) is behavior-neutral for the runtime while restoring WSL1 compatibility.

                      What do you see instead?

                      cannot execute binary file: Exec format error

                      Additional information

                      The linux x64 binary ships a PT_LOAD segment (containing the lpstub section used by the --use-largepages feature) whose p_align is 2 MB:

                      # readelf -lW node-v24.16.0 (offending segment)
                      Type Offset VirtAddr ... Flg Align
                      LOAD 0x2c00000 0x0000000003000000 ... R E 0x200000 <-- p_align = 2 MiB
                      

                      #16198 introduced the section alignment (sh_addralign) for the code mover and its been there for a while. The regression started recently where the program headers started respecting it due to toolchain bump,

                      NodeOfficial linux-x64 toolchainGNU ldlpstub segment p_align
                      v22.xRHEL 8 with gcc-toolset-10binutils 2.350x1000 (works on WSL1)
                      v23.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)
                      v24.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)

                      binutils commit 74e315dbfe5, first released in binutils 2.38 added a code path in assign_file_positions_for_load_sections that, for a section whose alignment
                      exceeds maxpagesize (on x86-64 maxpagesize is 0x1000), stamps the segment's p_align to the section alignment. Under binutils 2.35 the segment's p_align was unconditionally maxpagesize (0x1000).

                      Kernel 5.10+ ce81bb256a22 respects the large p_align segment values for PIE binaries but it doesn't do any rejection in other cases. However, WSL1's binfmt_elf seems to reject any PT_LOAD whose p_align exceeds the system page size.

                      WSL is not a Tier 1 platform, thought I would raise this here for awareness and if there was interest to have a link time fix after seeing microsoft/WSL#8151. For VSCode remote server where I encountered this, applied a similar solution https://github.com/microsoft/vscode/pull/319355/changes

                      Activity

                      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

                        buildIssues and PRs related to Node.js builds or CI infrastructure.windowsIssues and PRs related to the Windows platform.wslIssues and PRs related to the Windows Subsystem for Linux.

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          linux x64 release binary fails to exec on WSL1 #63735

                          Description

                          @deepak1556

                          Version

                          v24.16.0 (also reproduces on every v23.x and v24.x release; does not reproduce on v22.x)

                          Platform

                          Any **WSL1** distro. WSL2 is unaffected.
                          

                          Subsystem

                          No response

                          What steps will reproduce the bug?

                          curl -LO https://nodejs.org/dist/v24.16.0/node-v24.16.0-linux-x64.tar.gz
                          tar xf node-v24.16.0-linux-x64.tar.gz
                          ./node-v24.16.0-linux-x64/bin/node --version

                          How often does it reproduce? Is there a required condition?

                          Always, needs WSL1 distro

                          What is the expected behavior? Why is that the expected behavior?

                          node should exec and run normally on WSL1, as it did on v22.x. The 2MB p_align carries no runtime benefit for the Node executable today:

                          • Current executable is of type ET_EXEC with fixed p_vaddr. The kernel maps each PT_LOAD at its hard-coded address.
                          • The --use-largepages feature performs its hugepage remap at runtime; it never reads p_align.

                          So the lpstubPT_LOAD advertising p_align = 0x200000 is unnecessary, and clamping it to the page size (0x1000) is behavior-neutral for the runtime while restoring WSL1 compatibility.

                          What do you see instead?

                          cannot execute binary file: Exec format error

                          Additional information

                          The linux x64 binary ships a PT_LOAD segment (containing the lpstub section used by the --use-largepages feature) whose p_align is 2 MB:

                          # readelf -lW node-v24.16.0 (offending segment)
                          Type Offset VirtAddr ... Flg Align
                          LOAD 0x2c00000 0x0000000003000000 ... R E 0x200000 <-- p_align = 2 MiB
                          

                          #16198 introduced the section alignment (sh_addralign) for the code mover and its been there for a while. The regression started recently where the program headers started respecting it due to toolchain bump,

                          NodeOfficial linux-x64 toolchainGNU ldlpstub segment p_align
                          v22.xRHEL 8 with gcc-toolset-10binutils 2.350x1000 (works on WSL1)
                          v23.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)
                          v24.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)

                          binutils commit 74e315dbfe5, first released in binutils 2.38 added a code path in assign_file_positions_for_load_sections that, for a section whose alignment
                          exceeds maxpagesize (on x86-64 maxpagesize is 0x1000), stamps the segment's p_align to the section alignment. Under binutils 2.35 the segment's p_align was unconditionally maxpagesize (0x1000).

                          Kernel 5.10+ ce81bb256a22 respects the large p_align segment values for PIE binaries but it doesn't do any rejection in other cases. However, WSL1's binfmt_elf seems to reject any PT_LOAD whose p_align exceeds the system page size.

                          WSL is not a Tier 1 platform, thought I would raise this here for awareness and if there was interest to have a link time fix after seeing microsoft/WSL#8151. For VSCode remote server where I encountered this, applied a similar solution https://github.com/microsoft/vscode/pull/319355/changes

                          Activity

                          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

                            buildIssues and PRs related to Node.js builds or CI infrastructure.windowsIssues and PRs related to the Windows platform.wslIssues and PRs related to the Windows Subsystem for Linux.

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              linux x64 release binary fails to exec on WSL1 #63735

                              Description

                              @deepak1556

                              Version

                              v24.16.0 (also reproduces on every v23.x and v24.x release; does not reproduce on v22.x)

                              Platform

                              Any **WSL1** distro. WSL2 is unaffected.
                              

                              Subsystem

                              No response

                              What steps will reproduce the bug?

                              curl -LO https://nodejs.org/dist/v24.16.0/node-v24.16.0-linux-x64.tar.gz
                              tar xf node-v24.16.0-linux-x64.tar.gz
                              ./node-v24.16.0-linux-x64/bin/node --version

                              How often does it reproduce? Is there a required condition?

                              Always, needs WSL1 distro

                              What is the expected behavior? Why is that the expected behavior?

                              node should exec and run normally on WSL1, as it did on v22.x. The 2MB p_align carries no runtime benefit for the Node executable today:

                              • Current executable is of type ET_EXEC with fixed p_vaddr. The kernel maps each PT_LOAD at its hard-coded address.
                              • The --use-largepages feature performs its hugepage remap at runtime; it never reads p_align.

                              So the lpstubPT_LOAD advertising p_align = 0x200000 is unnecessary, and clamping it to the page size (0x1000) is behavior-neutral for the runtime while restoring WSL1 compatibility.

                              What do you see instead?

                              cannot execute binary file: Exec format error

                              Additional information

                              The linux x64 binary ships a PT_LOAD segment (containing the lpstub section used by the --use-largepages feature) whose p_align is 2 MB:

                              # readelf -lW node-v24.16.0 (offending segment)
                              Type Offset VirtAddr ... Flg Align
                              LOAD 0x2c00000 0x0000000003000000 ... R E 0x200000 <-- p_align = 2 MiB
                              

                              #16198 introduced the section alignment (sh_addralign) for the code mover and its been there for a while. The regression started recently where the program headers started respecting it due to toolchain bump,

                              NodeOfficial linux-x64 toolchainGNU ldlpstub segment p_align
                              v22.xRHEL 8 with gcc-toolset-10binutils 2.350x1000 (works on WSL1)
                              v23.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)
                              v24.xRHEL 8 with gcc-toolset-12binutils 2.380x200000 (rejected)

                              binutils commit 74e315dbfe5, first released in binutils 2.38 added a code path in assign_file_positions_for_load_sections that, for a section whose alignment
                              exceeds maxpagesize (on x86-64 maxpagesize is 0x1000), stamps the segment's p_align to the section alignment. Under binutils 2.35 the segment's p_align was unconditionally maxpagesize (0x1000).

                              Kernel 5.10+ ce81bb256a22 respects the large p_align segment values for PIE binaries but it doesn't do any rejection in other cases. However, WSL1's binfmt_elf seems to reject any PT_LOAD whose p_align exceeds the system page size.

                              WSL is not a Tier 1 platform, thought I would raise this here for awareness and if there was interest to have a link time fix after seeing microsoft/WSL#8151. For VSCode remote server where I encountered this, applied a similar solution https://github.com/microsoft/vscode/pull/319355/changes

                              Activity

                              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

                                buildIssues and PRs related to Node.js builds or CI infrastructure.windowsIssues and PRs related to the Windows platform.wslIssues and PRs related to the Windows Subsystem for Linux.

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions