Skip to content

ELF linker code crashes instead of reporting malformed archive #18205

Description

@andrewrk

Zig Version

0.12.0-dev.1784+c357b902b

Steps to Reproduce and Observed Behavior

$ wget https://andrewkelley.me/temp/bad_libcompiler_rt.a
$ stage4/bin/zig build-obj ../test/standalone/hello_world/hello.zig -fno-llvm -fno-lld
$ stage4/bin/zig build-obj -fno-llvm -fno-lld hello.o bad_libcompiler_rt.a
thread 2810416 panic: index out of bounds: index 6148914691236517204, len 1126320
/home/andy/Downloads/zig/src/link/Elf/Object.zig:816:39: 0x6cf8334 in shdrContents (zig)
return self.data[shdr.sh_offset..][0..shdr.sh_size];
^
/home/andy/Downloads/zig/src/link/Elf/Object.zig:72:55: 0x773ba68 in parse (zig)
try self.strtab.appendSlice(gpa, self.shdrContents(self.header.?.e_shstrndx));
^
/home/andy/Downloads/zig/src/link/Elf.zig:1845:25: 0x727c8ff in parseArchive (zig)
try object.parse(self);
^
/home/andy/Downloads/zig/src/link/Elf.zig:1789:30: 0x6d54e12 in parseLibrary (zig)
try self.parseArchive(lib.path, must_link, ctx);
^
/home/andy/Downloads/zig/src/link/Elf.zig:1780:30: 0x6d544f1 in parsePositional (zig)
try self.parseLibrary(.{ .path = path }, must_link, ctx);
^
/home/andy/Downloads/zig/src/link/Elf.zig:1436:29: 0x6d537f5 in flushObject (zig)
self.parsePositional(obj.path, obj.must_link, &parse_ctx) catch |err|
^
/home/andy/Downloads/zig/src/link/Elf.zig:979:49: 0x68e6f89 in flushModule (zig)
if (self.isObject()) return self.flushObject(comp, module_obj_path);
^
/home/andy/Downloads/zig/src/link/Elf.zig:932:25: 0x65cbbfe in flush (zig)
try self.flushModule(comp, prog_node);
^
/home/andy/Downloads/zig/src/link.zig:823:68: 0x62992e3 in flush (zig)
.elf => return @fieldParentPtr(Elf, "base", base).flush(comp, prog_node),
^
/home/andy/Downloads/zig/src/Compilation.zig:2657:24: 0x6298b45 in flush (zig)
comp.bin_file.flush(comp, prog_node) catch |err| switch (err) {
^
/home/andy/Downloads/zig/src/Compilation.zig:2614:23: 0x62dcd3e in update (zig)
try comp.flush(main_progress_node);
^
/home/andy/Downloads/zig/src/main.zig:4283:24: 0x630c692 in updateModule (zig)
try comp.update(main_progress_node);
^
/home/andy/Downloads/zig/src/main.zig:3684:17: 0x632f25a in buildOutputType (zig)
updateModule(comp) catch |err| switch (err) {
^
/home/andy/Downloads/zig/src/main.zig:282:31: 0x613823f in mainArgs (zig)
return buildOutputType(gpa, arena, args, .{ .build = .Obj });
^
/home/andy/Downloads/zig/src/main.zig:222:20: 0x6135315 in main (zig)
return mainArgs(gpa, arena, args);
^
/home/andy/Downloads/zig/lib/std/start.zig:585:37: 0x6134d96 in main (zig)
const result = root.main() catch |err| {
^
???:?:?: 0x7f15c7fe7acd in ??? (libc.so.6)
Unwind information for `libc.so.6:0x7f15c7fe7acd` was not available, trace may be incomplete
Aborted (core dumped)

That's if you're lucky! A release build of the compiler has much more misleading outcomes.

Expected Behavior

It should report an error that the archive is malformed. If, for example, I run nm on that file:

$ nm -a bad_libcompiler_rt.a
nm: compiler_rt.o: file format not recognized

This is much more helpful when diagnosing problems, especially when working on the compiler!

In general, the linker should not assert that input files are well-formed.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugObserved behavior contradicts documented or intended behaviorlinking

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
       blocks
      (function() {
      function addCopyButtons() {
      document.querySelectorAll('pre code').forEach(function(codeBlock) {
      if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
      codeBlock.parentElement.setAttribute('data-copy-added', 'true');
      var btn = document.createElement('button');
      btn.textContent = 'Copy';
      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;';
      btn.onmouseover = function() { this.style.opacity = '1'; };
      btn.onmouseout = function() { this.style.opacity = '0.7'; };
      btn.onclick = function() {
      navigator.clipboard.writeText(codeBlock.textContent).then(function() {
      btn.textContent = 'Copied!';
      setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
      });
      };
      codeBlock.parentElement.style.position = 'relative';
      codeBlock.parentElement.appendChild(btn);
      });
      }
      addCopyButtons();
      // Re-run on dynamic content
      var observer = new MutationObserver(addCopyButtons);
      observer.observe(document.body, { childList: true, subtree: true });
      })();
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      ELF linker code crashes instead of reporting malformed archive · Issue #18205 · ziglang/zig · GitHub
      Skip to content

      ELF linker code crashes instead of reporting malformed archive #18205

      Description

      @andrewrk

      Zig Version

      0.12.0-dev.1784+c357b902b

      Steps to Reproduce and Observed Behavior

      $ wget https://andrewkelley.me/temp/bad_libcompiler_rt.a
      $ stage4/bin/zig build-obj ../test/standalone/hello_world/hello.zig -fno-llvm -fno-lld
      $ stage4/bin/zig build-obj -fno-llvm -fno-lld hello.o bad_libcompiler_rt.a
      thread 2810416 panic: index out of bounds: index 6148914691236517204, len 1126320
      /home/andy/Downloads/zig/src/link/Elf/Object.zig:816:39: 0x6cf8334 in shdrContents (zig)
      return self.data[shdr.sh_offset..][0..shdr.sh_size];
      ^
      /home/andy/Downloads/zig/src/link/Elf/Object.zig:72:55: 0x773ba68 in parse (zig)
      try self.strtab.appendSlice(gpa, self.shdrContents(self.header.?.e_shstrndx));
      ^
      /home/andy/Downloads/zig/src/link/Elf.zig:1845:25: 0x727c8ff in parseArchive (zig)
      try object.parse(self);
      ^
      /home/andy/Downloads/zig/src/link/Elf.zig:1789:30: 0x6d54e12 in parseLibrary (zig)
      try self.parseArchive(lib.path, must_link, ctx);
      ^
      /home/andy/Downloads/zig/src/link/Elf.zig:1780:30: 0x6d544f1 in parsePositional (zig)
      try self.parseLibrary(.{ .path = path }, must_link, ctx);
      ^
      /home/andy/Downloads/zig/src/link/Elf.zig:1436:29: 0x6d537f5 in flushObject (zig)
      self.parsePositional(obj.path, obj.must_link, &parse_ctx) catch |err|
      ^
      /home/andy/Downloads/zig/src/link/Elf.zig:979:49: 0x68e6f89 in flushModule (zig)
      if (self.isObject()) return self.flushObject(comp, module_obj_path);
      ^
      /home/andy/Downloads/zig/src/link/Elf.zig:932:25: 0x65cbbfe in flush (zig)
      try self.flushModule(comp, prog_node);
      ^
      /home/andy/Downloads/zig/src/link.zig:823:68: 0x62992e3 in flush (zig)
      .elf => return @fieldParentPtr(Elf, "base", base).flush(comp, prog_node),
      ^
      /home/andy/Downloads/zig/src/Compilation.zig:2657:24: 0x6298b45 in flush (zig)
      comp.bin_file.flush(comp, prog_node) catch |err| switch (err) {
      ^
      /home/andy/Downloads/zig/src/Compilation.zig:2614:23: 0x62dcd3e in update (zig)
      try comp.flush(main_progress_node);
      ^
      /home/andy/Downloads/zig/src/main.zig:4283:24: 0x630c692 in updateModule (zig)
      try comp.update(main_progress_node);
      ^
      /home/andy/Downloads/zig/src/main.zig:3684:17: 0x632f25a in buildOutputType (zig)
      updateModule(comp) catch |err| switch (err) {
      ^
      /home/andy/Downloads/zig/src/main.zig:282:31: 0x613823f in mainArgs (zig)
      return buildOutputType(gpa, arena, args, .{ .build = .Obj });
      ^
      /home/andy/Downloads/zig/src/main.zig:222:20: 0x6135315 in main (zig)
      return mainArgs(gpa, arena, args);
      ^
      /home/andy/Downloads/zig/lib/std/start.zig:585:37: 0x6134d96 in main (zig)
      const result = root.main() catch |err| {
      ^
      ???:?:?: 0x7f15c7fe7acd in ??? (libc.so.6)
      Unwind information for `libc.so.6:0x7f15c7fe7acd` was not available, trace may be incomplete
      Aborted (core dumped)
      

      That's if you're lucky! A release build of the compiler has much more misleading outcomes.

      Expected Behavior

      It should report an error that the archive is malformed. If, for example, I run nm on that file:

      $ nm -a bad_libcompiler_rt.a
      nm: compiler_rt.o: file format not recognized
      

      This is much more helpful when diagnosing problems, especially when working on the compiler!

      In general, the linker should not assert that input files are well-formed.

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        bugObserved behavior contradicts documented or intended behaviorlinking

        Type

        No type

        Projects

        No projects

          Milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

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

          ELF linker code crashes instead of reporting malformed archive #18205

          Description

          @andrewrk

          Zig Version

          0.12.0-dev.1784+c357b902b

          Steps to Reproduce and Observed Behavior

          $ wget https://andrewkelley.me/temp/bad_libcompiler_rt.a
          $ stage4/bin/zig build-obj ../test/standalone/hello_world/hello.zig -fno-llvm -fno-lld
          $ stage4/bin/zig build-obj -fno-llvm -fno-lld hello.o bad_libcompiler_rt.a
          thread 2810416 panic: index out of bounds: index 6148914691236517204, len 1126320
          /home/andy/Downloads/zig/src/link/Elf/Object.zig:816:39: 0x6cf8334 in shdrContents (zig)
          return self.data[shdr.sh_offset..][0..shdr.sh_size];
          ^
          /home/andy/Downloads/zig/src/link/Elf/Object.zig:72:55: 0x773ba68 in parse (zig)
          try self.strtab.appendSlice(gpa, self.shdrContents(self.header.?.e_shstrndx));
          ^
          /home/andy/Downloads/zig/src/link/Elf.zig:1845:25: 0x727c8ff in parseArchive (zig)
          try object.parse(self);
          ^
          /home/andy/Downloads/zig/src/link/Elf.zig:1789:30: 0x6d54e12 in parseLibrary (zig)
          try self.parseArchive(lib.path, must_link, ctx);
          ^
          /home/andy/Downloads/zig/src/link/Elf.zig:1780:30: 0x6d544f1 in parsePositional (zig)
          try self.parseLibrary(.{ .path = path }, must_link, ctx);
          ^
          /home/andy/Downloads/zig/src/link/Elf.zig:1436:29: 0x6d537f5 in flushObject (zig)
          self.parsePositional(obj.path, obj.must_link, &parse_ctx) catch |err|
          ^
          /home/andy/Downloads/zig/src/link/Elf.zig:979:49: 0x68e6f89 in flushModule (zig)
          if (self.isObject()) return self.flushObject(comp, module_obj_path);
          ^
          /home/andy/Downloads/zig/src/link/Elf.zig:932:25: 0x65cbbfe in flush (zig)
          try self.flushModule(comp, prog_node);
          ^
          /home/andy/Downloads/zig/src/link.zig:823:68: 0x62992e3 in flush (zig)
          .elf => return @fieldParentPtr(Elf, "base", base).flush(comp, prog_node),
          ^
          /home/andy/Downloads/zig/src/Compilation.zig:2657:24: 0x6298b45 in flush (zig)
          comp.bin_file.flush(comp, prog_node) catch |err| switch (err) {
          ^
          /home/andy/Downloads/zig/src/Compilation.zig:2614:23: 0x62dcd3e in update (zig)
          try comp.flush(main_progress_node);
          ^
          /home/andy/Downloads/zig/src/main.zig:4283:24: 0x630c692 in updateModule (zig)
          try comp.update(main_progress_node);
          ^
          /home/andy/Downloads/zig/src/main.zig:3684:17: 0x632f25a in buildOutputType (zig)
          updateModule(comp) catch |err| switch (err) {
          ^
          /home/andy/Downloads/zig/src/main.zig:282:31: 0x613823f in mainArgs (zig)
          return buildOutputType(gpa, arena, args, .{ .build = .Obj });
          ^
          /home/andy/Downloads/zig/src/main.zig:222:20: 0x6135315 in main (zig)
          return mainArgs(gpa, arena, args);
          ^
          /home/andy/Downloads/zig/lib/std/start.zig:585:37: 0x6134d96 in main (zig)
          const result = root.main() catch |err| {
          ^
          ???:?:?: 0x7f15c7fe7acd in ??? (libc.so.6)
          Unwind information for `libc.so.6:0x7f15c7fe7acd` was not available, trace may be incomplete
          Aborted (core dumped)
          

          That's if you're lucky! A release build of the compiler has much more misleading outcomes.

          Expected Behavior

          It should report an error that the archive is malformed. If, for example, I run nm on that file:

          $ nm -a bad_libcompiler_rt.a
          nm: compiler_rt.o: file format not recognized
          

          This is much more helpful when diagnosing problems, especially when working on the compiler!

          In general, the linker should not assert that input files are well-formed.

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            bugObserved behavior contradicts documented or intended behaviorlinking

            Type

            No type

            Projects

            No projects

              Milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

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

              ELF linker code crashes instead of reporting malformed archive #18205

              Description

              @andrewrk

              Zig Version

              0.12.0-dev.1784+c357b902b

              Steps to Reproduce and Observed Behavior

              $ wget https://andrewkelley.me/temp/bad_libcompiler_rt.a
              $ stage4/bin/zig build-obj ../test/standalone/hello_world/hello.zig -fno-llvm -fno-lld
              $ stage4/bin/zig build-obj -fno-llvm -fno-lld hello.o bad_libcompiler_rt.a
              thread 2810416 panic: index out of bounds: index 6148914691236517204, len 1126320
              /home/andy/Downloads/zig/src/link/Elf/Object.zig:816:39: 0x6cf8334 in shdrContents (zig)
              return self.data[shdr.sh_offset..][0..shdr.sh_size];
              ^
              /home/andy/Downloads/zig/src/link/Elf/Object.zig:72:55: 0x773ba68 in parse (zig)
              try self.strtab.appendSlice(gpa, self.shdrContents(self.header.?.e_shstrndx));
              ^
              /home/andy/Downloads/zig/src/link/Elf.zig:1845:25: 0x727c8ff in parseArchive (zig)
              try object.parse(self);
              ^
              /home/andy/Downloads/zig/src/link/Elf.zig:1789:30: 0x6d54e12 in parseLibrary (zig)
              try self.parseArchive(lib.path, must_link, ctx);
              ^
              /home/andy/Downloads/zig/src/link/Elf.zig:1780:30: 0x6d544f1 in parsePositional (zig)
              try self.parseLibrary(.{ .path = path }, must_link, ctx);
              ^
              /home/andy/Downloads/zig/src/link/Elf.zig:1436:29: 0x6d537f5 in flushObject (zig)
              self.parsePositional(obj.path, obj.must_link, &parse_ctx) catch |err|
              ^
              /home/andy/Downloads/zig/src/link/Elf.zig:979:49: 0x68e6f89 in flushModule (zig)
              if (self.isObject()) return self.flushObject(comp, module_obj_path);
              ^
              /home/andy/Downloads/zig/src/link/Elf.zig:932:25: 0x65cbbfe in flush (zig)
              try self.flushModule(comp, prog_node);
              ^
              /home/andy/Downloads/zig/src/link.zig:823:68: 0x62992e3 in flush (zig)
              .elf => return @fieldParentPtr(Elf, "base", base).flush(comp, prog_node),
              ^
              /home/andy/Downloads/zig/src/Compilation.zig:2657:24: 0x6298b45 in flush (zig)
              comp.bin_file.flush(comp, prog_node) catch |err| switch (err) {
              ^
              /home/andy/Downloads/zig/src/Compilation.zig:2614:23: 0x62dcd3e in update (zig)
              try comp.flush(main_progress_node);
              ^
              /home/andy/Downloads/zig/src/main.zig:4283:24: 0x630c692 in updateModule (zig)
              try comp.update(main_progress_node);
              ^
              /home/andy/Downloads/zig/src/main.zig:3684:17: 0x632f25a in buildOutputType (zig)
              updateModule(comp) catch |err| switch (err) {
              ^
              /home/andy/Downloads/zig/src/main.zig:282:31: 0x613823f in mainArgs (zig)
              return buildOutputType(gpa, arena, args, .{ .build = .Obj });
              ^
              /home/andy/Downloads/zig/src/main.zig:222:20: 0x6135315 in main (zig)
              return mainArgs(gpa, arena, args);
              ^
              /home/andy/Downloads/zig/lib/std/start.zig:585:37: 0x6134d96 in main (zig)
              const result = root.main() catch |err| {
              ^
              ???:?:?: 0x7f15c7fe7acd in ??? (libc.so.6)
              Unwind information for `libc.so.6:0x7f15c7fe7acd` was not available, trace may be incomplete
              Aborted (core dumped)
              

              That's if you're lucky! A release build of the compiler has much more misleading outcomes.

              Expected Behavior

              It should report an error that the archive is malformed. If, for example, I run nm on that file:

              $ nm -a bad_libcompiler_rt.a
              nm: compiler_rt.o: file format not recognized
              

              This is much more helpful when diagnosing problems, especially when working on the compiler!

              In general, the linker should not assert that input files are well-formed.

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                bugObserved behavior contradicts documented or intended behaviorlinking

                Type

                No type

                Projects

                No projects

                  Milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

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

                  ELF linker code crashes instead of reporting malformed archive #18205

                  Description

                  @andrewrk

                  Zig Version

                  0.12.0-dev.1784+c357b902b

                  Steps to Reproduce and Observed Behavior

                  $ wget https://andrewkelley.me/temp/bad_libcompiler_rt.a
                  $ stage4/bin/zig build-obj ../test/standalone/hello_world/hello.zig -fno-llvm -fno-lld
                  $ stage4/bin/zig build-obj -fno-llvm -fno-lld hello.o bad_libcompiler_rt.a
                  thread 2810416 panic: index out of bounds: index 6148914691236517204, len 1126320
                  /home/andy/Downloads/zig/src/link/Elf/Object.zig:816:39: 0x6cf8334 in shdrContents (zig)
                  return self.data[shdr.sh_offset..][0..shdr.sh_size];
                  ^
                  /home/andy/Downloads/zig/src/link/Elf/Object.zig:72:55: 0x773ba68 in parse (zig)
                  try self.strtab.appendSlice(gpa, self.shdrContents(self.header.?.e_shstrndx));
                  ^
                  /home/andy/Downloads/zig/src/link/Elf.zig:1845:25: 0x727c8ff in parseArchive (zig)
                  try object.parse(self);
                  ^
                  /home/andy/Downloads/zig/src/link/Elf.zig:1789:30: 0x6d54e12 in parseLibrary (zig)
                  try self.parseArchive(lib.path, must_link, ctx);
                  ^
                  /home/andy/Downloads/zig/src/link/Elf.zig:1780:30: 0x6d544f1 in parsePositional (zig)
                  try self.parseLibrary(.{ .path = path }, must_link, ctx);
                  ^
                  /home/andy/Downloads/zig/src/link/Elf.zig:1436:29: 0x6d537f5 in flushObject (zig)
                  self.parsePositional(obj.path, obj.must_link, &parse_ctx) catch |err|
                  ^
                  /home/andy/Downloads/zig/src/link/Elf.zig:979:49: 0x68e6f89 in flushModule (zig)
                  if (self.isObject()) return self.flushObject(comp, module_obj_path);
                  ^
                  /home/andy/Downloads/zig/src/link/Elf.zig:932:25: 0x65cbbfe in flush (zig)
                  try self.flushModule(comp, prog_node);
                  ^
                  /home/andy/Downloads/zig/src/link.zig:823:68: 0x62992e3 in flush (zig)
                  .elf => return @fieldParentPtr(Elf, "base", base).flush(comp, prog_node),
                  ^
                  /home/andy/Downloads/zig/src/Compilation.zig:2657:24: 0x6298b45 in flush (zig)
                  comp.bin_file.flush(comp, prog_node) catch |err| switch (err) {
                  ^
                  /home/andy/Downloads/zig/src/Compilation.zig:2614:23: 0x62dcd3e in update (zig)
                  try comp.flush(main_progress_node);
                  ^
                  /home/andy/Downloads/zig/src/main.zig:4283:24: 0x630c692 in updateModule (zig)
                  try comp.update(main_progress_node);
                  ^
                  /home/andy/Downloads/zig/src/main.zig:3684:17: 0x632f25a in buildOutputType (zig)
                  updateModule(comp) catch |err| switch (err) {
                  ^
                  /home/andy/Downloads/zig/src/main.zig:282:31: 0x613823f in mainArgs (zig)
                  return buildOutputType(gpa, arena, args, .{ .build = .Obj });
                  ^
                  /home/andy/Downloads/zig/src/main.zig:222:20: 0x6135315 in main (zig)
                  return mainArgs(gpa, arena, args);
                  ^
                  /home/andy/Downloads/zig/lib/std/start.zig:585:37: 0x6134d96 in main (zig)
                  const result = root.main() catch |err| {
                  ^
                  ???:?:?: 0x7f15c7fe7acd in ??? (libc.so.6)
                  Unwind information for `libc.so.6:0x7f15c7fe7acd` was not available, trace may be incomplete
                  Aborted (core dumped)
                  

                  That's if you're lucky! A release build of the compiler has much more misleading outcomes.

                  Expected Behavior

                  It should report an error that the archive is malformed. If, for example, I run nm on that file:

                  $ nm -a bad_libcompiler_rt.a
                  nm: compiler_rt.o: file format not recognized
                  

                  This is much more helpful when diagnosing problems, especially when working on the compiler!

                  In general, the linker should not assert that input files are well-formed.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    bugObserved behavior contradicts documented or intended behaviorlinking

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

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

                      ELF linker code crashes instead of reporting malformed archive #18205

                      Description

                      @andrewrk

                      Zig Version

                      0.12.0-dev.1784+c357b902b

                      Steps to Reproduce and Observed Behavior

                      $ wget https://andrewkelley.me/temp/bad_libcompiler_rt.a
                      $ stage4/bin/zig build-obj ../test/standalone/hello_world/hello.zig -fno-llvm -fno-lld
                      $ stage4/bin/zig build-obj -fno-llvm -fno-lld hello.o bad_libcompiler_rt.a
                      thread 2810416 panic: index out of bounds: index 6148914691236517204, len 1126320
                      /home/andy/Downloads/zig/src/link/Elf/Object.zig:816:39: 0x6cf8334 in shdrContents (zig)
                      return self.data[shdr.sh_offset..][0..shdr.sh_size];
                      ^
                      /home/andy/Downloads/zig/src/link/Elf/Object.zig:72:55: 0x773ba68 in parse (zig)
                      try self.strtab.appendSlice(gpa, self.shdrContents(self.header.?.e_shstrndx));
                      ^
                      /home/andy/Downloads/zig/src/link/Elf.zig:1845:25: 0x727c8ff in parseArchive (zig)
                      try object.parse(self);
                      ^
                      /home/andy/Downloads/zig/src/link/Elf.zig:1789:30: 0x6d54e12 in parseLibrary (zig)
                      try self.parseArchive(lib.path, must_link, ctx);
                      ^
                      /home/andy/Downloads/zig/src/link/Elf.zig:1780:30: 0x6d544f1 in parsePositional (zig)
                      try self.parseLibrary(.{ .path = path }, must_link, ctx);
                      ^
                      /home/andy/Downloads/zig/src/link/Elf.zig:1436:29: 0x6d537f5 in flushObject (zig)
                      self.parsePositional(obj.path, obj.must_link, &parse_ctx) catch |err|
                      ^
                      /home/andy/Downloads/zig/src/link/Elf.zig:979:49: 0x68e6f89 in flushModule (zig)
                      if (self.isObject()) return self.flushObject(comp, module_obj_path);
                      ^
                      /home/andy/Downloads/zig/src/link/Elf.zig:932:25: 0x65cbbfe in flush (zig)
                      try self.flushModule(comp, prog_node);
                      ^
                      /home/andy/Downloads/zig/src/link.zig:823:68: 0x62992e3 in flush (zig)
                      .elf => return @fieldParentPtr(Elf, "base", base).flush(comp, prog_node),
                      ^
                      /home/andy/Downloads/zig/src/Compilation.zig:2657:24: 0x6298b45 in flush (zig)
                      comp.bin_file.flush(comp, prog_node) catch |err| switch (err) {
                      ^
                      /home/andy/Downloads/zig/src/Compilation.zig:2614:23: 0x62dcd3e in update (zig)
                      try comp.flush(main_progress_node);
                      ^
                      /home/andy/Downloads/zig/src/main.zig:4283:24: 0x630c692 in updateModule (zig)
                      try comp.update(main_progress_node);
                      ^
                      /home/andy/Downloads/zig/src/main.zig:3684:17: 0x632f25a in buildOutputType (zig)
                      updateModule(comp) catch |err| switch (err) {
                      ^
                      /home/andy/Downloads/zig/src/main.zig:282:31: 0x613823f in mainArgs (zig)
                      return buildOutputType(gpa, arena, args, .{ .build = .Obj });
                      ^
                      /home/andy/Downloads/zig/src/main.zig:222:20: 0x6135315 in main (zig)
                      return mainArgs(gpa, arena, args);
                      ^
                      /home/andy/Downloads/zig/lib/std/start.zig:585:37: 0x6134d96 in main (zig)
                      const result = root.main() catch |err| {
                      ^
                      ???:?:?: 0x7f15c7fe7acd in ??? (libc.so.6)
                      Unwind information for `libc.so.6:0x7f15c7fe7acd` was not available, trace may be incomplete
                      Aborted (core dumped)
                      

                      That's if you're lucky! A release build of the compiler has much more misleading outcomes.

                      Expected Behavior

                      It should report an error that the archive is malformed. If, for example, I run nm on that file:

                      $ nm -a bad_libcompiler_rt.a
                      nm: compiler_rt.o: file format not recognized
                      

                      This is much more helpful when diagnosing problems, especially when working on the compiler!

                      In general, the linker should not assert that input files are well-formed.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        bugObserved behavior contradicts documented or intended behaviorlinking

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

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

                          ELF linker code crashes instead of reporting malformed archive #18205

                          Description

                          @andrewrk

                          Zig Version

                          0.12.0-dev.1784+c357b902b

                          Steps to Reproduce and Observed Behavior

                          $ wget https://andrewkelley.me/temp/bad_libcompiler_rt.a
                          $ stage4/bin/zig build-obj ../test/standalone/hello_world/hello.zig -fno-llvm -fno-lld
                          $ stage4/bin/zig build-obj -fno-llvm -fno-lld hello.o bad_libcompiler_rt.a
                          thread 2810416 panic: index out of bounds: index 6148914691236517204, len 1126320
                          /home/andy/Downloads/zig/src/link/Elf/Object.zig:816:39: 0x6cf8334 in shdrContents (zig)
                          return self.data[shdr.sh_offset..][0..shdr.sh_size];
                          ^
                          /home/andy/Downloads/zig/src/link/Elf/Object.zig:72:55: 0x773ba68 in parse (zig)
                          try self.strtab.appendSlice(gpa, self.shdrContents(self.header.?.e_shstrndx));
                          ^
                          /home/andy/Downloads/zig/src/link/Elf.zig:1845:25: 0x727c8ff in parseArchive (zig)
                          try object.parse(self);
                          ^
                          /home/andy/Downloads/zig/src/link/Elf.zig:1789:30: 0x6d54e12 in parseLibrary (zig)
                          try self.parseArchive(lib.path, must_link, ctx);
                          ^
                          /home/andy/Downloads/zig/src/link/Elf.zig:1780:30: 0x6d544f1 in parsePositional (zig)
                          try self.parseLibrary(.{ .path = path }, must_link, ctx);
                          ^
                          /home/andy/Downloads/zig/src/link/Elf.zig:1436:29: 0x6d537f5 in flushObject (zig)
                          self.parsePositional(obj.path, obj.must_link, &parse_ctx) catch |err|
                          ^
                          /home/andy/Downloads/zig/src/link/Elf.zig:979:49: 0x68e6f89 in flushModule (zig)
                          if (self.isObject()) return self.flushObject(comp, module_obj_path);
                          ^
                          /home/andy/Downloads/zig/src/link/Elf.zig:932:25: 0x65cbbfe in flush (zig)
                          try self.flushModule(comp, prog_node);
                          ^
                          /home/andy/Downloads/zig/src/link.zig:823:68: 0x62992e3 in flush (zig)
                          .elf => return @fieldParentPtr(Elf, "base", base).flush(comp, prog_node),
                          ^
                          /home/andy/Downloads/zig/src/Compilation.zig:2657:24: 0x6298b45 in flush (zig)
                          comp.bin_file.flush(comp, prog_node) catch |err| switch (err) {
                          ^
                          /home/andy/Downloads/zig/src/Compilation.zig:2614:23: 0x62dcd3e in update (zig)
                          try comp.flush(main_progress_node);
                          ^
                          /home/andy/Downloads/zig/src/main.zig:4283:24: 0x630c692 in updateModule (zig)
                          try comp.update(main_progress_node);
                          ^
                          /home/andy/Downloads/zig/src/main.zig:3684:17: 0x632f25a in buildOutputType (zig)
                          updateModule(comp) catch |err| switch (err) {
                          ^
                          /home/andy/Downloads/zig/src/main.zig:282:31: 0x613823f in mainArgs (zig)
                          return buildOutputType(gpa, arena, args, .{ .build = .Obj });
                          ^
                          /home/andy/Downloads/zig/src/main.zig:222:20: 0x6135315 in main (zig)
                          return mainArgs(gpa, arena, args);
                          ^
                          /home/andy/Downloads/zig/lib/std/start.zig:585:37: 0x6134d96 in main (zig)
                          const result = root.main() catch |err| {
                          ^
                          ???:?:?: 0x7f15c7fe7acd in ??? (libc.so.6)
                          Unwind information for `libc.so.6:0x7f15c7fe7acd` was not available, trace may be incomplete
                          Aborted (core dumped)
                          

                          That's if you're lucky! A release build of the compiler has much more misleading outcomes.

                          Expected Behavior

                          It should report an error that the archive is malformed. If, for example, I run nm on that file:

                          $ nm -a bad_libcompiler_rt.a
                          nm: compiler_rt.o: file format not recognized
                          

                          This is much more helpful when diagnosing problems, especially when working on the compiler!

                          In general, the linker should not assert that input files are well-formed.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            bugObserved behavior contradicts documented or intended behaviorlinking

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

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

                              ELF linker code crashes instead of reporting malformed archive #18205

                              Description

                              @andrewrk

                              Zig Version

                              0.12.0-dev.1784+c357b902b

                              Steps to Reproduce and Observed Behavior

                              $ wget https://andrewkelley.me/temp/bad_libcompiler_rt.a
                              $ stage4/bin/zig build-obj ../test/standalone/hello_world/hello.zig -fno-llvm -fno-lld
                              $ stage4/bin/zig build-obj -fno-llvm -fno-lld hello.o bad_libcompiler_rt.a
                              thread 2810416 panic: index out of bounds: index 6148914691236517204, len 1126320
                              /home/andy/Downloads/zig/src/link/Elf/Object.zig:816:39: 0x6cf8334 in shdrContents (zig)
                              return self.data[shdr.sh_offset..][0..shdr.sh_size];
                              ^
                              /home/andy/Downloads/zig/src/link/Elf/Object.zig:72:55: 0x773ba68 in parse (zig)
                              try self.strtab.appendSlice(gpa, self.shdrContents(self.header.?.e_shstrndx));
                              ^
                              /home/andy/Downloads/zig/src/link/Elf.zig:1845:25: 0x727c8ff in parseArchive (zig)
                              try object.parse(self);
                              ^
                              /home/andy/Downloads/zig/src/link/Elf.zig:1789:30: 0x6d54e12 in parseLibrary (zig)
                              try self.parseArchive(lib.path, must_link, ctx);
                              ^
                              /home/andy/Downloads/zig/src/link/Elf.zig:1780:30: 0x6d544f1 in parsePositional (zig)
                              try self.parseLibrary(.{ .path = path }, must_link, ctx);
                              ^
                              /home/andy/Downloads/zig/src/link/Elf.zig:1436:29: 0x6d537f5 in flushObject (zig)
                              self.parsePositional(obj.path, obj.must_link, &parse_ctx) catch |err|
                              ^
                              /home/andy/Downloads/zig/src/link/Elf.zig:979:49: 0x68e6f89 in flushModule (zig)
                              if (self.isObject()) return self.flushObject(comp, module_obj_path);
                              ^
                              /home/andy/Downloads/zig/src/link/Elf.zig:932:25: 0x65cbbfe in flush (zig)
                              try self.flushModule(comp, prog_node);
                              ^
                              /home/andy/Downloads/zig/src/link.zig:823:68: 0x62992e3 in flush (zig)
                              .elf => return @fieldParentPtr(Elf, "base", base).flush(comp, prog_node),
                              ^
                              /home/andy/Downloads/zig/src/Compilation.zig:2657:24: 0x6298b45 in flush (zig)
                              comp.bin_file.flush(comp, prog_node) catch |err| switch (err) {
                              ^
                              /home/andy/Downloads/zig/src/Compilation.zig:2614:23: 0x62dcd3e in update (zig)
                              try comp.flush(main_progress_node);
                              ^
                              /home/andy/Downloads/zig/src/main.zig:4283:24: 0x630c692 in updateModule (zig)
                              try comp.update(main_progress_node);
                              ^
                              /home/andy/Downloads/zig/src/main.zig:3684:17: 0x632f25a in buildOutputType (zig)
                              updateModule(comp) catch |err| switch (err) {
                              ^
                              /home/andy/Downloads/zig/src/main.zig:282:31: 0x613823f in mainArgs (zig)
                              return buildOutputType(gpa, arena, args, .{ .build = .Obj });
                              ^
                              /home/andy/Downloads/zig/src/main.zig:222:20: 0x6135315 in main (zig)
                              return mainArgs(gpa, arena, args);
                              ^
                              /home/andy/Downloads/zig/lib/std/start.zig:585:37: 0x6134d96 in main (zig)
                              const result = root.main() catch |err| {
                              ^
                              ???:?:?: 0x7f15c7fe7acd in ??? (libc.so.6)
                              Unwind information for `libc.so.6:0x7f15c7fe7acd` was not available, trace may be incomplete
                              Aborted (core dumped)
                              

                              That's if you're lucky! A release build of the compiler has much more misleading outcomes.

                              Expected Behavior

                              It should report an error that the archive is malformed. If, for example, I run nm on that file:

                              $ nm -a bad_libcompiler_rt.a
                              nm: compiler_rt.o: file format not recognized
                              

                              This is much more helpful when diagnosing problems, especially when working on the compiler!

                              In general, the linker should not assert that input files are well-formed.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                bugObserved behavior contradicts documented or intended behaviorlinking

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions