linux: export getauxval when not compiling with libc - #16977

Merged
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup
Sep 4, 2023
Merged

linux: export getauxval when not compiling with libc#16977
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup

Conversation

@kcbanner

@kcbannerkcbanner commented Aug 26, 2023

Copy link
Copy Markdown
Contributor

Closes#16975.

Before:

thread 4288 panic: panic
Panicked during a panic. Aborting.
Aborted

After:

thread 4135 panic: panic
/mnt/c/cygwin64/home/kcbanner/temp/16975/lib.zig:2:5: 0x2ae695 in panic (lib)
@panic("panic");
^
/mnt/c/cygwin64/home/kcbanner/temp/16975/exe.zig:4:10: 0x23a7e8 in main (exe)
panic();
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:360:22: 0x23a0ac in posixCallMainAndExit (exe)
while (envp_optional[envp_count]) |_| : (envp_count += 1) {}
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:243:5: 0x239c01 in _start (exe)
asm volatile (switch (native_arch) {
^
???:?:?:

The issue was caused by the version of elf_aux_maybe (linux.zig) in lib not being initialized by the startup code (since only the version in the exe existed), which caused the phdr lookup to fail (due to underflow when subtracting from zero).

The panic within a panic trace:

#0 0x00000000002ddc54 in process.getBaseAddress () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/process.zig:1079
#1 0x00000000002cec55 in os.dl_iterate_phdr__anon_5275 (context=0x7fffffffc120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/os.zig:5409
#2 0x00000000002ce749 in debug.DebugInfo.lookupModuleDl (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1837
#3 0x00000000002cf5dd in debug.DebugInfo.getModuleForAddress (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1561
#4 0x00000000002f633f in debug.StackIterator.next_unwind (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:643
#5 0x00000000002e9670 in debug.StackIterator.next_internal (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:669
#6 0x00000000002dad0f in debug.StackIterator.next (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:584
#7 0x00000000002daadc in debug.writeCurrentStackTrace__anon_7051 (out_stream=..., debug_info=0x326608 <debug.self_debug_info>, tty_config=..., start_addr=...)
at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:731
#8 0x00000000002aef67 in debug.dumpCurrentStackTrace (start_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:127
#9 0x00000000002ae897 in debug.panicImpl (trace=0x0, first_trace_addr=..., msg=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:421
#10 0x00000000002ae6f7 in builtin.default_panic (msg=..., error_return_trace=0x0, ret_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/builtin.zig:813
#11 0x00000000002ae696 in panic () at lib.zig:2
#12 0x000000000023a7e9 in exe.main () at exe.zig:4
#13 0x000000000023a0ad in start.posixCallMainAndExit () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:360
#14 0x0000000000239c02 in _start () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:243

However, this fix does pose a couple questions:

@kcbanner

Copy link
Copy Markdown
ContributorAuthor

The CI failure:

error: ld.lld: relocation R_X86_64_PC32 cannot be used against symbol '_elf_aux_maybe'; recompile with -fPIC
note: defined in /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o
note: referenced by linux.zig:163 (/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/os/linux.zig:163)
note: /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o:(os.linux.getauxval)

This happens on the tests which use dynamic linking - but specifying force_pic on the exe/lib doesn't resolve it.

@kcbannerkcbanner changed the title linux: export elf_aux_maybe so that libraries can call getauxvallinux: export getauxval when not compiling with libcAug 28, 2023

@kubkonkubkon left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to my inexperienced eyes, but I do have a few questions that perhaps you can answer.

Comment threadlib/std/os/linux.zig
/// This matches the libc getauxval function.
pub extern fn getauxval(index: usize) usize;
comptime {
@export(getauxvalImpl, .{ .name = "getauxval", .linkage = .Weak });

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine? What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

@kcbannerkcbannerSep 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine?

Yes, exactly. The intention is that the version used is the one that references the elf_aux_maybe initialized by the startup code.

What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

My assumption had been that the version in the exe would take precedence, but if this is not true in all cases then this solution won't be adequate.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gotcha thanks!

@Aransentin

Copy link
Copy Markdown
Contributor

Right now this pollutes every non-libC Zig Linux binary with the getauxv symbol & code, even if they never load libraries... This also means the compiler can't optimize away the ELF header parsing if nothing else uses it.

Not a massive amount of bloat for real programs, but significant for the tiny "demo" binaries I like to make.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack trace not printed when panicking in imported function

3 participants

@kcbanner@Aransentin@kubkon
, '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: export getauxval when not compiling with libc - #16977

Merged
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup
Sep 4, 2023
Merged

linux: export getauxval when not compiling with libc#16977
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup

Conversation

@kcbanner

@kcbannerkcbanner commented Aug 26, 2023

Copy link
Copy Markdown
Contributor

Closes#16975.

Before:

thread 4288 panic: panic
Panicked during a panic. Aborting.
Aborted

After:

thread 4135 panic: panic
/mnt/c/cygwin64/home/kcbanner/temp/16975/lib.zig:2:5: 0x2ae695 in panic (lib)
@panic("panic");
^
/mnt/c/cygwin64/home/kcbanner/temp/16975/exe.zig:4:10: 0x23a7e8 in main (exe)
panic();
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:360:22: 0x23a0ac in posixCallMainAndExit (exe)
while (envp_optional[envp_count]) |_| : (envp_count += 1) {}
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:243:5: 0x239c01 in _start (exe)
asm volatile (switch (native_arch) {
^
???:?:?:

The issue was caused by the version of elf_aux_maybe (linux.zig) in lib not being initialized by the startup code (since only the version in the exe existed), which caused the phdr lookup to fail (due to underflow when subtracting from zero).

The panic within a panic trace:

#0 0x00000000002ddc54 in process.getBaseAddress () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/process.zig:1079
#1 0x00000000002cec55 in os.dl_iterate_phdr__anon_5275 (context=0x7fffffffc120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/os.zig:5409
#2 0x00000000002ce749 in debug.DebugInfo.lookupModuleDl (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1837
#3 0x00000000002cf5dd in debug.DebugInfo.getModuleForAddress (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1561
#4 0x00000000002f633f in debug.StackIterator.next_unwind (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:643
#5 0x00000000002e9670 in debug.StackIterator.next_internal (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:669
#6 0x00000000002dad0f in debug.StackIterator.next (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:584
#7 0x00000000002daadc in debug.writeCurrentStackTrace__anon_7051 (out_stream=..., debug_info=0x326608 <debug.self_debug_info>, tty_config=..., start_addr=...)
at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:731
#8 0x00000000002aef67 in debug.dumpCurrentStackTrace (start_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:127
#9 0x00000000002ae897 in debug.panicImpl (trace=0x0, first_trace_addr=..., msg=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:421
#10 0x00000000002ae6f7 in builtin.default_panic (msg=..., error_return_trace=0x0, ret_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/builtin.zig:813
#11 0x00000000002ae696 in panic () at lib.zig:2
#12 0x000000000023a7e9 in exe.main () at exe.zig:4
#13 0x000000000023a0ad in start.posixCallMainAndExit () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:360
#14 0x0000000000239c02 in _start () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:243

However, this fix does pose a couple questions:

@kcbanner

Copy link
Copy Markdown
ContributorAuthor

The CI failure:

error: ld.lld: relocation R_X86_64_PC32 cannot be used against symbol '_elf_aux_maybe'; recompile with -fPIC
note: defined in /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o
note: referenced by linux.zig:163 (/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/os/linux.zig:163)
note: /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o:(os.linux.getauxval)

This happens on the tests which use dynamic linking - but specifying force_pic on the exe/lib doesn't resolve it.

@kcbannerkcbanner changed the title linux: export elf_aux_maybe so that libraries can call getauxvallinux: export getauxval when not compiling with libcAug 28, 2023

@kubkonkubkon left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to my inexperienced eyes, but I do have a few questions that perhaps you can answer.

Comment threadlib/std/os/linux.zig
/// This matches the libc getauxval function.
pub extern fn getauxval(index: usize) usize;
comptime {
@export(getauxvalImpl, .{ .name = "getauxval", .linkage = .Weak });

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine? What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

@kcbannerkcbannerSep 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine?

Yes, exactly. The intention is that the version used is the one that references the elf_aux_maybe initialized by the startup code.

What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

My assumption had been that the version in the exe would take precedence, but if this is not true in all cases then this solution won't be adequate.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gotcha thanks!

@Aransentin

Copy link
Copy Markdown
Contributor

Right now this pollutes every non-libC Zig Linux binary with the getauxv symbol & code, even if they never load libraries... This also means the compiler can't optimize away the ELF header parsing if nothing else uses it.

Not a massive amount of bloat for real programs, but significant for the tiny "demo" binaries I like to make.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack trace not printed when panicking in imported function

3 participants

@kcbanner@Aransentin@kubkon
, '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: export getauxval when not compiling with libc - #16977

Merged
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup
Sep 4, 2023
Merged

linux: export getauxval when not compiling with libc#16977
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup

Conversation

@kcbanner

@kcbannerkcbanner commented Aug 26, 2023

Copy link
Copy Markdown
Contributor

Closes#16975.

Before:

thread 4288 panic: panic
Panicked during a panic. Aborting.
Aborted

After:

thread 4135 panic: panic
/mnt/c/cygwin64/home/kcbanner/temp/16975/lib.zig:2:5: 0x2ae695 in panic (lib)
@panic("panic");
^
/mnt/c/cygwin64/home/kcbanner/temp/16975/exe.zig:4:10: 0x23a7e8 in main (exe)
panic();
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:360:22: 0x23a0ac in posixCallMainAndExit (exe)
while (envp_optional[envp_count]) |_| : (envp_count += 1) {}
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:243:5: 0x239c01 in _start (exe)
asm volatile (switch (native_arch) {
^
???:?:?:

The issue was caused by the version of elf_aux_maybe (linux.zig) in lib not being initialized by the startup code (since only the version in the exe existed), which caused the phdr lookup to fail (due to underflow when subtracting from zero).

The panic within a panic trace:

#0 0x00000000002ddc54 in process.getBaseAddress () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/process.zig:1079
#1 0x00000000002cec55 in os.dl_iterate_phdr__anon_5275 (context=0x7fffffffc120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/os.zig:5409
#2 0x00000000002ce749 in debug.DebugInfo.lookupModuleDl (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1837
#3 0x00000000002cf5dd in debug.DebugInfo.getModuleForAddress (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1561
#4 0x00000000002f633f in debug.StackIterator.next_unwind (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:643
#5 0x00000000002e9670 in debug.StackIterator.next_internal (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:669
#6 0x00000000002dad0f in debug.StackIterator.next (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:584
#7 0x00000000002daadc in debug.writeCurrentStackTrace__anon_7051 (out_stream=..., debug_info=0x326608 <debug.self_debug_info>, tty_config=..., start_addr=...)
at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:731
#8 0x00000000002aef67 in debug.dumpCurrentStackTrace (start_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:127
#9 0x00000000002ae897 in debug.panicImpl (trace=0x0, first_trace_addr=..., msg=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:421
#10 0x00000000002ae6f7 in builtin.default_panic (msg=..., error_return_trace=0x0, ret_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/builtin.zig:813
#11 0x00000000002ae696 in panic () at lib.zig:2
#12 0x000000000023a7e9 in exe.main () at exe.zig:4
#13 0x000000000023a0ad in start.posixCallMainAndExit () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:360
#14 0x0000000000239c02 in _start () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:243

However, this fix does pose a couple questions:

@kcbanner

Copy link
Copy Markdown
ContributorAuthor

The CI failure:

error: ld.lld: relocation R_X86_64_PC32 cannot be used against symbol '_elf_aux_maybe'; recompile with -fPIC
note: defined in /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o
note: referenced by linux.zig:163 (/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/os/linux.zig:163)
note: /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o:(os.linux.getauxval)

This happens on the tests which use dynamic linking - but specifying force_pic on the exe/lib doesn't resolve it.

@kcbannerkcbanner changed the title linux: export elf_aux_maybe so that libraries can call getauxvallinux: export getauxval when not compiling with libcAug 28, 2023

@kubkonkubkon left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to my inexperienced eyes, but I do have a few questions that perhaps you can answer.

Comment threadlib/std/os/linux.zig
/// This matches the libc getauxval function.
pub extern fn getauxval(index: usize) usize;
comptime {
@export(getauxvalImpl, .{ .name = "getauxval", .linkage = .Weak });

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine? What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

@kcbannerkcbannerSep 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine?

Yes, exactly. The intention is that the version used is the one that references the elf_aux_maybe initialized by the startup code.

What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

My assumption had been that the version in the exe would take precedence, but if this is not true in all cases then this solution won't be adequate.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gotcha thanks!

@Aransentin

Copy link
Copy Markdown
Contributor

Right now this pollutes every non-libC Zig Linux binary with the getauxv symbol & code, even if they never load libraries... This also means the compiler can't optimize away the ELF header parsing if nothing else uses it.

Not a massive amount of bloat for real programs, but significant for the tiny "demo" binaries I like to make.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack trace not printed when panicking in imported function

3 participants

@kcbanner@Aransentin@kubkon
, '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: export getauxval when not compiling with libc - #16977

Merged
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup
Sep 4, 2023
Merged

linux: export getauxval when not compiling with libc#16977
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup

Conversation

@kcbanner

@kcbannerkcbanner commented Aug 26, 2023

Copy link
Copy Markdown
Contributor

Closes#16975.

Before:

thread 4288 panic: panic
Panicked during a panic. Aborting.
Aborted

After:

thread 4135 panic: panic
/mnt/c/cygwin64/home/kcbanner/temp/16975/lib.zig:2:5: 0x2ae695 in panic (lib)
@panic("panic");
^
/mnt/c/cygwin64/home/kcbanner/temp/16975/exe.zig:4:10: 0x23a7e8 in main (exe)
panic();
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:360:22: 0x23a0ac in posixCallMainAndExit (exe)
while (envp_optional[envp_count]) |_| : (envp_count += 1) {}
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:243:5: 0x239c01 in _start (exe)
asm volatile (switch (native_arch) {
^
???:?:?:

The issue was caused by the version of elf_aux_maybe (linux.zig) in lib not being initialized by the startup code (since only the version in the exe existed), which caused the phdr lookup to fail (due to underflow when subtracting from zero).

The panic within a panic trace:

#0 0x00000000002ddc54 in process.getBaseAddress () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/process.zig:1079
#1 0x00000000002cec55 in os.dl_iterate_phdr__anon_5275 (context=0x7fffffffc120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/os.zig:5409
#2 0x00000000002ce749 in debug.DebugInfo.lookupModuleDl (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1837
#3 0x00000000002cf5dd in debug.DebugInfo.getModuleForAddress (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1561
#4 0x00000000002f633f in debug.StackIterator.next_unwind (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:643
#5 0x00000000002e9670 in debug.StackIterator.next_internal (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:669
#6 0x00000000002dad0f in debug.StackIterator.next (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:584
#7 0x00000000002daadc in debug.writeCurrentStackTrace__anon_7051 (out_stream=..., debug_info=0x326608 <debug.self_debug_info>, tty_config=..., start_addr=...)
at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:731
#8 0x00000000002aef67 in debug.dumpCurrentStackTrace (start_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:127
#9 0x00000000002ae897 in debug.panicImpl (trace=0x0, first_trace_addr=..., msg=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:421
#10 0x00000000002ae6f7 in builtin.default_panic (msg=..., error_return_trace=0x0, ret_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/builtin.zig:813
#11 0x00000000002ae696 in panic () at lib.zig:2
#12 0x000000000023a7e9 in exe.main () at exe.zig:4
#13 0x000000000023a0ad in start.posixCallMainAndExit () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:360
#14 0x0000000000239c02 in _start () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:243

However, this fix does pose a couple questions:

@kcbanner

Copy link
Copy Markdown
ContributorAuthor

The CI failure:

error: ld.lld: relocation R_X86_64_PC32 cannot be used against symbol '_elf_aux_maybe'; recompile with -fPIC
note: defined in /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o
note: referenced by linux.zig:163 (/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/os/linux.zig:163)
note: /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o:(os.linux.getauxval)

This happens on the tests which use dynamic linking - but specifying force_pic on the exe/lib doesn't resolve it.

@kcbannerkcbanner changed the title linux: export elf_aux_maybe so that libraries can call getauxvallinux: export getauxval when not compiling with libcAug 28, 2023

@kubkonkubkon left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to my inexperienced eyes, but I do have a few questions that perhaps you can answer.

Comment threadlib/std/os/linux.zig
/// This matches the libc getauxval function.
pub extern fn getauxval(index: usize) usize;
comptime {
@export(getauxvalImpl, .{ .name = "getauxval", .linkage = .Weak });

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine? What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

@kcbannerkcbannerSep 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine?

Yes, exactly. The intention is that the version used is the one that references the elf_aux_maybe initialized by the startup code.

What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

My assumption had been that the version in the exe would take precedence, but if this is not true in all cases then this solution won't be adequate.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gotcha thanks!

@Aransentin

Copy link
Copy Markdown
Contributor

Right now this pollutes every non-libC Zig Linux binary with the getauxv symbol & code, even if they never load libraries... This also means the compiler can't optimize away the ELF header parsing if nothing else uses it.

Not a massive amount of bloat for real programs, but significant for the tiny "demo" binaries I like to make.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack trace not printed when panicking in imported function

3 participants

@kcbanner@Aransentin@kubkon
, '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: export getauxval when not compiling with libc - #16977

Merged
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup
Sep 4, 2023
Merged

linux: export getauxval when not compiling with libc#16977
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup

Conversation

@kcbanner

@kcbannerkcbanner commented Aug 26, 2023

Copy link
Copy Markdown
Contributor

Closes#16975.

Before:

thread 4288 panic: panic
Panicked during a panic. Aborting.
Aborted

After:

thread 4135 panic: panic
/mnt/c/cygwin64/home/kcbanner/temp/16975/lib.zig:2:5: 0x2ae695 in panic (lib)
@panic("panic");
^
/mnt/c/cygwin64/home/kcbanner/temp/16975/exe.zig:4:10: 0x23a7e8 in main (exe)
panic();
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:360:22: 0x23a0ac in posixCallMainAndExit (exe)
while (envp_optional[envp_count]) |_| : (envp_count += 1) {}
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:243:5: 0x239c01 in _start (exe)
asm volatile (switch (native_arch) {
^
???:?:?:

The issue was caused by the version of elf_aux_maybe (linux.zig) in lib not being initialized by the startup code (since only the version in the exe existed), which caused the phdr lookup to fail (due to underflow when subtracting from zero).

The panic within a panic trace:

#0 0x00000000002ddc54 in process.getBaseAddress () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/process.zig:1079
#1 0x00000000002cec55 in os.dl_iterate_phdr__anon_5275 (context=0x7fffffffc120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/os.zig:5409
#2 0x00000000002ce749 in debug.DebugInfo.lookupModuleDl (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1837
#3 0x00000000002cf5dd in debug.DebugInfo.getModuleForAddress (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1561
#4 0x00000000002f633f in debug.StackIterator.next_unwind (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:643
#5 0x00000000002e9670 in debug.StackIterator.next_internal (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:669
#6 0x00000000002dad0f in debug.StackIterator.next (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:584
#7 0x00000000002daadc in debug.writeCurrentStackTrace__anon_7051 (out_stream=..., debug_info=0x326608 <debug.self_debug_info>, tty_config=..., start_addr=...)
at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:731
#8 0x00000000002aef67 in debug.dumpCurrentStackTrace (start_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:127
#9 0x00000000002ae897 in debug.panicImpl (trace=0x0, first_trace_addr=..., msg=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:421
#10 0x00000000002ae6f7 in builtin.default_panic (msg=..., error_return_trace=0x0, ret_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/builtin.zig:813
#11 0x00000000002ae696 in panic () at lib.zig:2
#12 0x000000000023a7e9 in exe.main () at exe.zig:4
#13 0x000000000023a0ad in start.posixCallMainAndExit () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:360
#14 0x0000000000239c02 in _start () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:243

However, this fix does pose a couple questions:

@kcbanner

Copy link
Copy Markdown
ContributorAuthor

The CI failure:

error: ld.lld: relocation R_X86_64_PC32 cannot be used against symbol '_elf_aux_maybe'; recompile with -fPIC
note: defined in /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o
note: referenced by linux.zig:163 (/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/os/linux.zig:163)
note: /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o:(os.linux.getauxval)

This happens on the tests which use dynamic linking - but specifying force_pic on the exe/lib doesn't resolve it.

@kcbannerkcbanner changed the title linux: export elf_aux_maybe so that libraries can call getauxvallinux: export getauxval when not compiling with libcAug 28, 2023

@kubkonkubkon left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to my inexperienced eyes, but I do have a few questions that perhaps you can answer.

Comment threadlib/std/os/linux.zig
/// This matches the libc getauxval function.
pub extern fn getauxval(index: usize) usize;
comptime {
@export(getauxvalImpl, .{ .name = "getauxval", .linkage = .Weak });

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine? What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

@kcbannerkcbannerSep 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine?

Yes, exactly. The intention is that the version used is the one that references the elf_aux_maybe initialized by the startup code.

What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

My assumption had been that the version in the exe would take precedence, but if this is not true in all cases then this solution won't be adequate.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gotcha thanks!

@Aransentin

Copy link
Copy Markdown
Contributor

Right now this pollutes every non-libC Zig Linux binary with the getauxv symbol & code, even if they never load libraries... This also means the compiler can't optimize away the ELF header parsing if nothing else uses it.

Not a massive amount of bloat for real programs, but significant for the tiny "demo" binaries I like to make.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack trace not printed when panicking in imported function

3 participants

@kcbanner@Aransentin@kubkon
, '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: export getauxval when not compiling with libc - #16977

Merged
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup
Sep 4, 2023
Merged

linux: export getauxval when not compiling with libc#16977
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup

Conversation

@kcbanner

@kcbannerkcbanner commented Aug 26, 2023

Copy link
Copy Markdown
Contributor

Closes#16975.

Before:

thread 4288 panic: panic
Panicked during a panic. Aborting.
Aborted

After:

thread 4135 panic: panic
/mnt/c/cygwin64/home/kcbanner/temp/16975/lib.zig:2:5: 0x2ae695 in panic (lib)
@panic("panic");
^
/mnt/c/cygwin64/home/kcbanner/temp/16975/exe.zig:4:10: 0x23a7e8 in main (exe)
panic();
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:360:22: 0x23a0ac in posixCallMainAndExit (exe)
while (envp_optional[envp_count]) |_| : (envp_count += 1) {}
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:243:5: 0x239c01 in _start (exe)
asm volatile (switch (native_arch) {
^
???:?:?:

The issue was caused by the version of elf_aux_maybe (linux.zig) in lib not being initialized by the startup code (since only the version in the exe existed), which caused the phdr lookup to fail (due to underflow when subtracting from zero).

The panic within a panic trace:

#0 0x00000000002ddc54 in process.getBaseAddress () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/process.zig:1079
#1 0x00000000002cec55 in os.dl_iterate_phdr__anon_5275 (context=0x7fffffffc120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/os.zig:5409
#2 0x00000000002ce749 in debug.DebugInfo.lookupModuleDl (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1837
#3 0x00000000002cf5dd in debug.DebugInfo.getModuleForAddress (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1561
#4 0x00000000002f633f in debug.StackIterator.next_unwind (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:643
#5 0x00000000002e9670 in debug.StackIterator.next_internal (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:669
#6 0x00000000002dad0f in debug.StackIterator.next (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:584
#7 0x00000000002daadc in debug.writeCurrentStackTrace__anon_7051 (out_stream=..., debug_info=0x326608 <debug.self_debug_info>, tty_config=..., start_addr=...)
at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:731
#8 0x00000000002aef67 in debug.dumpCurrentStackTrace (start_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:127
#9 0x00000000002ae897 in debug.panicImpl (trace=0x0, first_trace_addr=..., msg=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:421
#10 0x00000000002ae6f7 in builtin.default_panic (msg=..., error_return_trace=0x0, ret_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/builtin.zig:813
#11 0x00000000002ae696 in panic () at lib.zig:2
#12 0x000000000023a7e9 in exe.main () at exe.zig:4
#13 0x000000000023a0ad in start.posixCallMainAndExit () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:360
#14 0x0000000000239c02 in _start () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:243

However, this fix does pose a couple questions:

@kcbanner

Copy link
Copy Markdown
ContributorAuthor

The CI failure:

error: ld.lld: relocation R_X86_64_PC32 cannot be used against symbol '_elf_aux_maybe'; recompile with -fPIC
note: defined in /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o
note: referenced by linux.zig:163 (/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/os/linux.zig:163)
note: /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o:(os.linux.getauxval)

This happens on the tests which use dynamic linking - but specifying force_pic on the exe/lib doesn't resolve it.

@kcbannerkcbanner changed the title linux: export elf_aux_maybe so that libraries can call getauxvallinux: export getauxval when not compiling with libcAug 28, 2023

@kubkonkubkon left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to my inexperienced eyes, but I do have a few questions that perhaps you can answer.

Comment threadlib/std/os/linux.zig
/// This matches the libc getauxval function.
pub extern fn getauxval(index: usize) usize;
comptime {
@export(getauxvalImpl, .{ .name = "getauxval", .linkage = .Weak });

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine? What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

@kcbannerkcbannerSep 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine?

Yes, exactly. The intention is that the version used is the one that references the elf_aux_maybe initialized by the startup code.

What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

My assumption had been that the version in the exe would take precedence, but if this is not true in all cases then this solution won't be adequate.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gotcha thanks!

@Aransentin

Copy link
Copy Markdown
Contributor

Right now this pollutes every non-libC Zig Linux binary with the getauxv symbol & code, even if they never load libraries... This also means the compiler can't optimize away the ELF header parsing if nothing else uses it.

Not a massive amount of bloat for real programs, but significant for the tiny "demo" binaries I like to make.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack trace not printed when panicking in imported function

3 participants

@kcbanner@Aransentin@kubkon
, '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: export getauxval when not compiling with libc - #16977

Merged
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup
Sep 4, 2023
Merged

linux: export getauxval when not compiling with libc#16977
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup

Conversation

@kcbanner

@kcbannerkcbanner commented Aug 26, 2023

Copy link
Copy Markdown
Contributor

Closes#16975.

Before:

thread 4288 panic: panic
Panicked during a panic. Aborting.
Aborted

After:

thread 4135 panic: panic
/mnt/c/cygwin64/home/kcbanner/temp/16975/lib.zig:2:5: 0x2ae695 in panic (lib)
@panic("panic");
^
/mnt/c/cygwin64/home/kcbanner/temp/16975/exe.zig:4:10: 0x23a7e8 in main (exe)
panic();
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:360:22: 0x23a0ac in posixCallMainAndExit (exe)
while (envp_optional[envp_count]) |_| : (envp_count += 1) {}
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:243:5: 0x239c01 in _start (exe)
asm volatile (switch (native_arch) {
^
???:?:?:

The issue was caused by the version of elf_aux_maybe (linux.zig) in lib not being initialized by the startup code (since only the version in the exe existed), which caused the phdr lookup to fail (due to underflow when subtracting from zero).

The panic within a panic trace:

#0 0x00000000002ddc54 in process.getBaseAddress () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/process.zig:1079
#1 0x00000000002cec55 in os.dl_iterate_phdr__anon_5275 (context=0x7fffffffc120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/os.zig:5409
#2 0x00000000002ce749 in debug.DebugInfo.lookupModuleDl (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1837
#3 0x00000000002cf5dd in debug.DebugInfo.getModuleForAddress (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1561
#4 0x00000000002f633f in debug.StackIterator.next_unwind (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:643
#5 0x00000000002e9670 in debug.StackIterator.next_internal (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:669
#6 0x00000000002dad0f in debug.StackIterator.next (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:584
#7 0x00000000002daadc in debug.writeCurrentStackTrace__anon_7051 (out_stream=..., debug_info=0x326608 <debug.self_debug_info>, tty_config=..., start_addr=...)
at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:731
#8 0x00000000002aef67 in debug.dumpCurrentStackTrace (start_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:127
#9 0x00000000002ae897 in debug.panicImpl (trace=0x0, first_trace_addr=..., msg=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:421
#10 0x00000000002ae6f7 in builtin.default_panic (msg=..., error_return_trace=0x0, ret_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/builtin.zig:813
#11 0x00000000002ae696 in panic () at lib.zig:2
#12 0x000000000023a7e9 in exe.main () at exe.zig:4
#13 0x000000000023a0ad in start.posixCallMainAndExit () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:360
#14 0x0000000000239c02 in _start () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:243

However, this fix does pose a couple questions:

@kcbanner

Copy link
Copy Markdown
ContributorAuthor

The CI failure:

error: ld.lld: relocation R_X86_64_PC32 cannot be used against symbol '_elf_aux_maybe'; recompile with -fPIC
note: defined in /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o
note: referenced by linux.zig:163 (/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/os/linux.zig:163)
note: /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o:(os.linux.getauxval)

This happens on the tests which use dynamic linking - but specifying force_pic on the exe/lib doesn't resolve it.

@kcbannerkcbanner changed the title linux: export elf_aux_maybe so that libraries can call getauxvallinux: export getauxval when not compiling with libcAug 28, 2023

@kubkonkubkon left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to my inexperienced eyes, but I do have a few questions that perhaps you can answer.

Comment threadlib/std/os/linux.zig
/// This matches the libc getauxval function.
pub extern fn getauxval(index: usize) usize;
comptime {
@export(getauxvalImpl, .{ .name = "getauxval", .linkage = .Weak });

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine? What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

@kcbannerkcbannerSep 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine?

Yes, exactly. The intention is that the version used is the one that references the elf_aux_maybe initialized by the startup code.

What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

My assumption had been that the version in the exe would take precedence, but if this is not true in all cases then this solution won't be adequate.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gotcha thanks!

@Aransentin

Copy link
Copy Markdown
Contributor

Right now this pollutes every non-libC Zig Linux binary with the getauxv symbol & code, even if they never load libraries... This also means the compiler can't optimize away the ELF header parsing if nothing else uses it.

Not a massive amount of bloat for real programs, but significant for the tiny "demo" binaries I like to make.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack trace not printed when panicking in imported function

3 participants

@kcbanner@Aransentin@kubkon
, '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: export getauxval when not compiling with libc - #16977

Merged
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup
Sep 4, 2023
Merged

linux: export getauxval when not compiling with libc#16977
kubkon merged 4 commits into
ziglang:masterfrom
kcbanner:lib_getauxval_fixup

Conversation

@kcbanner

@kcbannerkcbanner commented Aug 26, 2023

Copy link
Copy Markdown
Contributor

Closes#16975.

Before:

thread 4288 panic: panic
Panicked during a panic. Aborting.
Aborted

After:

thread 4135 panic: panic
/mnt/c/cygwin64/home/kcbanner/temp/16975/lib.zig:2:5: 0x2ae695 in panic (lib)
@panic("panic");
^
/mnt/c/cygwin64/home/kcbanner/temp/16975/exe.zig:4:10: 0x23a7e8 in main (exe)
panic();
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:360:22: 0x23a0ac in posixCallMainAndExit (exe)
while (envp_optional[envp_count]) |_| : (envp_count += 1) {}
^
/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/start.zig:243:5: 0x239c01 in _start (exe)
asm volatile (switch (native_arch) {
^
???:?:?:

The issue was caused by the version of elf_aux_maybe (linux.zig) in lib not being initialized by the startup code (since only the version in the exe existed), which caused the phdr lookup to fail (due to underflow when subtracting from zero).

The panic within a panic trace:

#0 0x00000000002ddc54 in process.getBaseAddress () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/process.zig:1079
#1 0x00000000002cec55 in os.dl_iterate_phdr__anon_5275 (context=0x7fffffffc120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/os.zig:5409
#2 0x00000000002ce749 in debug.DebugInfo.lookupModuleDl (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1837
#3 0x00000000002cf5dd in debug.DebugInfo.getModuleForAddress (self=0x326608 <debug.self_debug_info>, address=2992457) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:1561
#4 0x00000000002f633f in debug.StackIterator.next_unwind (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:643
#5 0x00000000002e9670 in debug.StackIterator.next_internal (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:669
#6 0x00000000002dad0f in debug.StackIterator.next (self=0x7fffffffd120) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:584
#7 0x00000000002daadc in debug.writeCurrentStackTrace__anon_7051 (out_stream=..., debug_info=0x326608 <debug.self_debug_info>, tty_config=..., start_addr=...)
at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:731
#8 0x00000000002aef67 in debug.dumpCurrentStackTrace (start_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:127
#9 0x00000000002ae897 in debug.panicImpl (trace=0x0, first_trace_addr=..., msg=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/debug.zig:421
#10 0x00000000002ae6f7 in builtin.default_panic (msg=..., error_return_trace=0x0, ret_addr=...) at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/builtin.zig:813
#11 0x00000000002ae696 in panic () at lib.zig:2
#12 0x000000000023a7e9 in exe.main () at exe.zig:4
#13 0x000000000023a0ad in start.posixCallMainAndExit () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:360
#14 0x0000000000239c02 in _start () at /home/kcbanner/kit/zig-linux-x86_64-0.12.0-dev.170+750998eef/lib/std/start.zig:243

However, this fix does pose a couple questions:

@kcbanner

Copy link
Copy Markdown
ContributorAuthor

The CI failure:

error: ld.lld: relocation R_X86_64_PC32 cannot be used against symbol '_elf_aux_maybe'; recompile with -fPIC
note: defined in /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o
note: referenced by linux.zig:163 (/mnt/c/cygwin64/home/kcbanner/kit/zig/lib/std/os/linux.zig:163)
note: /mnt/c/cygwin64/home/kcbanner/kit/zig/test/standalone/load_dynamic_library/zig-cache/o/a3b4a5c0e1497f31df239eba4427558f/libadd.so.1.0.0.o:(os.linux.getauxval)

This happens on the tests which use dynamic linking - but specifying force_pic on the exe/lib doesn't resolve it.

@kcbannerkcbanner changed the title linux: export elf_aux_maybe so that libraries can call getauxvallinux: export getauxval when not compiling with libcAug 28, 2023

@kubkonkubkon left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to my inexperienced eyes, but I do have a few questions that perhaps you can answer.

Comment threadlib/std/os/linux.zig
/// This matches the libc getauxval function.
pub extern fn getauxval(index: usize) usize;
comptime {
@export(getauxvalImpl, .{ .name = "getauxval", .linkage = .Weak });

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine? What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

@kcbannerkcbannerSep 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I understand, we are exporting it as weak because we expect it to be overriden by a different version in an exe/dso that has getauxval hooked up into startup routine?

Yes, exactly. The intention is that the version used is the one that references the elf_aux_maybe initialized by the startup code.

What if we're building an exe and link with a dso? Which version takes precedence then? Do I even understand the problem correctly here?

My assumption had been that the version in the exe would take precedence, but if this is not true in all cases then this solution won't be adequate.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gotcha thanks!

@Aransentin

Copy link
Copy Markdown
Contributor

Right now this pollutes every non-libC Zig Linux binary with the getauxv symbol & code, even if they never load libraries... This also means the compiler can't optimize away the ELF header parsing if nothing else uses it.

Not a massive amount of bloat for real programs, but significant for the tiny "demo" binaries I like to make.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack trace not printed when panicking in imported function

3 participants

@kcbanner@Aransentin@kubkon