') + ')', '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('^' + ".*" + ', '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" + ', '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('^' + ".*" + ', '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); } })(); })(); [NativeAOT] Another attempt to prevent stripping exported symbols from executables when explicitly specified by ivanpovazan · Pull Request #86050 · dotnet/runtime · GitHub
Skip to content

[NativeAOT] Another attempt to prevent stripping exported symbols from executables when explicitly specified - #86050

Merged
jkotas merged 2 commits into
dotnet:mainfrom
ivanpovazan:naot-strip-fix
May 11, 2023
Merged

[NativeAOT] Another attempt to prevent stripping exported symbols from executables when explicitly specified#86050
jkotas merged 2 commits into
dotnet:mainfrom
ivanpovazan:naot-strip-fix

Conversation

@ivanpovazan

Copy link
Copy Markdown
Member

This PR fixes a regression caused by #85293 which was reverted by #85601

Problem

The issue with the initial approach is that we used the following strip command to keep only the symbols exported by the compiler:

strip -i -s <symbols_to_keep.exports> <binary>

However, executing this command produces a warning:

/Applications/Xcode_13.2.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip : warning : removing global symbols from a final linked no longer supported. Use -exported_symbols_list at link time when building: /Users/runner/work/1/s/artifacts/tests/coreclr/osx.x64.Release/nativeaot/GenerateUnmanagedEntryPoints/GenerateUnmanagedEntryPoints/native/GenerateUnmanagedEntryPoints [/Users/runner/work/1/s/src/tests/nativeaot/GenerateUnmanagedEntryPoints/GenerateUnmanagedEntryPoints.csproj] [/Users/runner/work/1/s/src/tests/build.proj]

This can be observed in the runtime CI lane: https://dev.azure.com/dnceng-public/public/_build/results?buildId=258886&view=logs&j=66dceaa3-58e2-55af-b0bc-5748606ebc0e&t=2c1c2642-0b2e-5086-de47-1b8a1c2ab601&l=637

On the other hand, the job osx-x64 Release NativeAOT_Libs in the runtime-extra-platforms CI lane, treats warnings as errors, which results with a build failure when stripping is attempted: https://dev.azure.com/dnceng-public/public/_build/results?buildId=257857&view=logs&j=1b7517dc-3493-5614-db19-9039ca700e8e&t=30be22c2-1ac3-5d1e-cae6-35f9adc3d580&l=6564

Solution

To achieve the desired behaviour, it is needed to:

  1. Export only the desired symbols during native linking, as suggested by the warning message (which we already do)
    <CustomLinkerArgInclude="-exported_symbols_list &quot;$(ExportsFile)&quot;"Condition="'$(_IsApplePlatform)' == 'true' and $(ExportsFile) != ''" />
  2. Strip local symbols from the binary:
strip -x <binary>

Fixes: #85600

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR fixes a regression caused by #85293 which was reverted by #85601

Problem

The issue with the initial approach is that we used the following strip command to keep only the symbols exported by the compiler:

strip -i -s <symbols_to_keep.exports> <binary>

However, executing this command produces a warning:

/Applications/Xcode_13.2.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip : warning : removing global symbols from a final linked no longer supported. Use -exported_symbols_list at link time when building: /Users/runner/work/1/s/artifacts/tests/coreclr/osx.x64.Release/nativeaot/GenerateUnmanagedEntryPoints/GenerateUnmanagedEntryPoints/native/GenerateUnmanagedEntryPoints [/Users/runner/work/1/s/src/tests/nativeaot/GenerateUnmanagedEntryPoints/GenerateUnmanagedEntryPoints.csproj] [/Users/runner/work/1/s/src/tests/build.proj]

This can be observed in the runtime CI lane: https://dev.azure.com/dnceng-public/public/_build/results?buildId=258886&view=logs&j=66dceaa3-58e2-55af-b0bc-5748606ebc0e&t=2c1c2642-0b2e-5086-de47-1b8a1c2ab601&l=637

On the other hand, the job osx-x64 Release NativeAOT_Libs in the runtime-extra-platforms CI lane, treats warnings as errors, which results with a build failure when stripping is attempted: https://dev.azure.com/dnceng-public/public/_build/results?buildId=257857&view=logs&j=1b7517dc-3493-5614-db19-9039ca700e8e&t=30be22c2-1ac3-5d1e-cae6-35f9adc3d580&l=6564

Solution

To achieve the desired behaviour, it is needed to:

  1. Export only the desired symbols during native linking, as suggested by the warning message (which we already do)
    <CustomLinkerArgInclude="-exported_symbols_list &quot;$(ExportsFile)&quot;"Condition="'$(_IsApplePlatform)' == 'true' and $(ExportsFile) != ''" />
  2. Strip local symbols from the binary:
strip -x <binary>

Fixes: #85600

Author:ivanpovazan
Assignees:ivanpovazan
Labels:

area-NativeAOT-coreclr

Milestone:-

@ivanpovazan

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@ivanpovazan

Copy link
Copy Markdown
MemberAuthor

/cc: @lambdageek@SamMonoRT

<_IgnoreLinkerWarnings>false</_IgnoreLinkerWarnings>
<_IgnoreLinkerWarnings Condition="'$(_IsApplePlatform)' == 'true'">true</_IgnoreLinkerWarnings>
<StripFlag Condition="'$(_IsApplePlatform)' == 'true' and '$(NativeLib)' == 'Shared'">-x</StripFlag> <!-- keep global symbols in dylib -->
<_StripFlag Condition="'$(_IsApplePlatform)' == 'true' and ('$(NativeLib)' == 'Shared' or '$(IlcExportUnmanagedEntrypoints)' == 'true')">-x</_StripFlag> <!-- keep global symbols in dylib (or if it is explicitly specified) -->

@jkotasjkotasMay 10, 2023

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.

Suggested change
<_StripFlagCondition="'$(_IsApplePlatform)' == 'true' and ('$(NativeLib)' == 'Shared' or '$(IlcExportUnmanagedEntrypoints)' == 'true')">-x</_StripFlag> <!-- keep global symbols in dylib (or if it is explicitly specified)-->
<_StripFlagCondition="'$(_IsApplePlatform)' == 'true' and '$(IlcExportUnmanagedEntrypoints)' == 'true'">-x</_StripFlag> <!-- keep global symbols -->

We set IlcExportUnmanagedEntrypoints for Shared lnative libs by default.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I missed that, thank you. Fixed.

@ivanpovazan

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jkotas
jkotas merged commit f1481ed into dotnet:mainMay 11, 2023
@ghostghost locked as resolved and limited conversation to collaborators Jun 10, 2023
@ivanpovazan
ivanpovazan deleted the naot-strip-fix branch August 15, 2023 09:44
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

OSX build error: Removing global symbols from a final linked no longer supported

2 participants

@ivanpovazan@jkotas