Skip to content

Add OpenBSD support for ICU library loading - #129124

Merged
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading
Jun 8, 2026
Merged

Add OpenBSD support for ICU library loading#129124
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading

Conversation

@am11

@am11am11 commented Jun 8, 2026

Copy link
Copy Markdown
Member

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering. Use unversioned dlopen calls and probe symbol versioning instead of attempting to load versioned library names.

Contributes to #124911.

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering.
Use unversioned dlopen calls and probe symbol versioning instead of
attempting to load versioned library names.
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-globalization
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11am11 added the os-openbsd OpenBSD OS, currently not officially supported label Jun 8, 2026
@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

Hello world was working with the override:

am11@foo:~$ DOTNET_ICU_VERSION_OVERRIDE=22 th/artifacts/bin/testhost/net11.0-openbsd-Debug-x64/dotnet exec~/projects/hw1/hw1/bin/Debug/net11.0/hw1.dll
Hello, World!
Environment.Version: 11.0.0
RuntimeInformation.OSDescription: OpenBSD 7.8 GENERIC.MP#54

This makes it work without.

@tarekgh

Copy link
Copy Markdown
Member

Two important caveats this PR introduces

  1. The manually installed ICU must be built --disable-renaming. The OpenBSD path calls FindSymbolVersion(-1, -1, -1, ...), which only matches the unversioned u_strlen. If you drop in a stock upstream ICU build (renaming enabled → u_strlen_78), dlopen succeeds but symbol resolution returns false and ICU fails to load. So a "more recent ICU" has to be packaged the OpenBSD way (unversioned symbols), not a vanilla ./configure && make build.

  2. DOTNET_ICU_VERSION_OVERRIDE no longer works on OpenBSD after this PR. This is the subtle one. FindLibUsingOverride (which reads DOTNET_ICU_VERSION_OVERRIDE) lives only in the #else generic-Unix branch (lines 332-432). The new OpenBSD #elif branch never calls it. Pre-PR, OpenBSD fell through to #else, which is exactly why the author's DOTNET_ICU_VERSION_OVERRIDE=22 workaround worked. Post-PR, that env var is silently ignored on OpenBSD. So the one knob that let you force a particular major version on the Linux path is gone for OpenBSD — you'd have to use LD_LIBRARY_PATH or app-local ICU instead.

@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

@tarekgh, I think it’s fine to make it work with OpenBSD packaging convention in a standard install just like we have for Android (at least for the bringup). Unlike some other desktop OS, OpenBSD seem to have one package version at a time policy, pkg_info -Q icu4c reports a single v77 option, same with other packages.

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

@tarekgh

Copy link
Copy Markdown
Member

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

I am not objecting, I am just pointing out OpenBSD will be kind of special case. At least we should document the new behavior in https://learn.microsoft.com/en-us/dotnet/core/extensions/globalization-icu for completeness.

@tarekghtarekgh 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.

CC @jkotas and @janvorli if they have feedback too.

@tarekghtarekgh added this to the 11.0.0 milestone Jun 8, 2026

@janvorlijanvorli 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.

LGTM, thank you!

@tarekgh
tarekgh merged commit fdec023 into dotnet:mainJun 8, 2026
177 of 180 checks passed
@am11
am11 deleted the feature/port/openbsd-libs-loading branch June 8, 2026 21:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 10, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Globalizationcommunity-contributionIndicates that the PR has been added by a community memberos-openbsdOpenBSD OS, currently not officially supported

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@am11@tarekgh@janvorli
, '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" + '
Add OpenBSD support for ICU library loading by am11 · Pull Request #129124 · dotnet/runtime · GitHub
Skip to content

Add OpenBSD support for ICU library loading - #129124

Merged
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading
Jun 8, 2026
Merged

Add OpenBSD support for ICU library loading#129124
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading

Conversation

@am11

@am11am11 commented Jun 8, 2026

Copy link
Copy Markdown
Member

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering. Use unversioned dlopen calls and probe symbol versioning instead of attempting to load versioned library names.

Contributes to #124911.

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering.
Use unversioned dlopen calls and probe symbol versioning instead of
attempting to load versioned library names.
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-globalization
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11am11 added the os-openbsd OpenBSD OS, currently not officially supported label Jun 8, 2026
@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

Hello world was working with the override:

am11@foo:~$ DOTNET_ICU_VERSION_OVERRIDE=22 th/artifacts/bin/testhost/net11.0-openbsd-Debug-x64/dotnet exec~/projects/hw1/hw1/bin/Debug/net11.0/hw1.dll
Hello, World!
Environment.Version: 11.0.0
RuntimeInformation.OSDescription: OpenBSD 7.8 GENERIC.MP#54

This makes it work without.

@tarekgh

Copy link
Copy Markdown
Member

Two important caveats this PR introduces

  1. The manually installed ICU must be built --disable-renaming. The OpenBSD path calls FindSymbolVersion(-1, -1, -1, ...), which only matches the unversioned u_strlen. If you drop in a stock upstream ICU build (renaming enabled → u_strlen_78), dlopen succeeds but symbol resolution returns false and ICU fails to load. So a "more recent ICU" has to be packaged the OpenBSD way (unversioned symbols), not a vanilla ./configure && make build.

  2. DOTNET_ICU_VERSION_OVERRIDE no longer works on OpenBSD after this PR. This is the subtle one. FindLibUsingOverride (which reads DOTNET_ICU_VERSION_OVERRIDE) lives only in the #else generic-Unix branch (lines 332-432). The new OpenBSD #elif branch never calls it. Pre-PR, OpenBSD fell through to #else, which is exactly why the author's DOTNET_ICU_VERSION_OVERRIDE=22 workaround worked. Post-PR, that env var is silently ignored on OpenBSD. So the one knob that let you force a particular major version on the Linux path is gone for OpenBSD — you'd have to use LD_LIBRARY_PATH or app-local ICU instead.

@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

@tarekgh, I think it’s fine to make it work with OpenBSD packaging convention in a standard install just like we have for Android (at least for the bringup). Unlike some other desktop OS, OpenBSD seem to have one package version at a time policy, pkg_info -Q icu4c reports a single v77 option, same with other packages.

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

@tarekgh

Copy link
Copy Markdown
Member

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

I am not objecting, I am just pointing out OpenBSD will be kind of special case. At least we should document the new behavior in https://learn.microsoft.com/en-us/dotnet/core/extensions/globalization-icu for completeness.

@tarekghtarekgh 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.

CC @jkotas and @janvorli if they have feedback too.

@tarekghtarekgh added this to the 11.0.0 milestone Jun 8, 2026

@janvorlijanvorli 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.

LGTM, thank you!

@tarekgh
tarekgh merged commit fdec023 into dotnet:mainJun 8, 2026
177 of 180 checks passed
@am11
am11 deleted the feature/port/openbsd-libs-loading branch June 8, 2026 21:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 10, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Globalizationcommunity-contributionIndicates that the PR has been added by a community memberos-openbsdOpenBSD OS, currently not officially supported

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@am11@tarekgh@janvorli
, '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('^' + ".*" + ' Add OpenBSD support for ICU library loading by am11 · Pull Request #129124 · dotnet/runtime · GitHub
Skip to content

Add OpenBSD support for ICU library loading - #129124

Merged
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading
Jun 8, 2026
Merged

Add OpenBSD support for ICU library loading#129124
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading

Conversation

@am11

@am11am11 commented Jun 8, 2026

Copy link
Copy Markdown
Member

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering. Use unversioned dlopen calls and probe symbol versioning instead of attempting to load versioned library names.

Contributes to #124911.

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering.
Use unversioned dlopen calls and probe symbol versioning instead of
attempting to load versioned library names.
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-globalization
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11am11 added the os-openbsd OpenBSD OS, currently not officially supported label Jun 8, 2026
@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

Hello world was working with the override:

am11@foo:~$ DOTNET_ICU_VERSION_OVERRIDE=22 th/artifacts/bin/testhost/net11.0-openbsd-Debug-x64/dotnet exec~/projects/hw1/hw1/bin/Debug/net11.0/hw1.dll
Hello, World!
Environment.Version: 11.0.0
RuntimeInformation.OSDescription: OpenBSD 7.8 GENERIC.MP#54

This makes it work without.

@tarekgh

Copy link
Copy Markdown
Member

Two important caveats this PR introduces

  1. The manually installed ICU must be built --disable-renaming. The OpenBSD path calls FindSymbolVersion(-1, -1, -1, ...), which only matches the unversioned u_strlen. If you drop in a stock upstream ICU build (renaming enabled → u_strlen_78), dlopen succeeds but symbol resolution returns false and ICU fails to load. So a "more recent ICU" has to be packaged the OpenBSD way (unversioned symbols), not a vanilla ./configure && make build.

  2. DOTNET_ICU_VERSION_OVERRIDE no longer works on OpenBSD after this PR. This is the subtle one. FindLibUsingOverride (which reads DOTNET_ICU_VERSION_OVERRIDE) lives only in the #else generic-Unix branch (lines 332-432). The new OpenBSD #elif branch never calls it. Pre-PR, OpenBSD fell through to #else, which is exactly why the author's DOTNET_ICU_VERSION_OVERRIDE=22 workaround worked. Post-PR, that env var is silently ignored on OpenBSD. So the one knob that let you force a particular major version on the Linux path is gone for OpenBSD — you'd have to use LD_LIBRARY_PATH or app-local ICU instead.

@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

@tarekgh, I think it’s fine to make it work with OpenBSD packaging convention in a standard install just like we have for Android (at least for the bringup). Unlike some other desktop OS, OpenBSD seem to have one package version at a time policy, pkg_info -Q icu4c reports a single v77 option, same with other packages.

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

@tarekgh

Copy link
Copy Markdown
Member

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

I am not objecting, I am just pointing out OpenBSD will be kind of special case. At least we should document the new behavior in https://learn.microsoft.com/en-us/dotnet/core/extensions/globalization-icu for completeness.

@tarekghtarekgh 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.

CC @jkotas and @janvorli if they have feedback too.

@tarekghtarekgh added this to the 11.0.0 milestone Jun 8, 2026

@janvorlijanvorli 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.

LGTM, thank you!

@tarekgh
tarekgh merged commit fdec023 into dotnet:mainJun 8, 2026
177 of 180 checks passed
@am11
am11 deleted the feature/port/openbsd-libs-loading branch June 8, 2026 21:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 10, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Globalizationcommunity-contributionIndicates that the PR has been added by a community memberos-openbsdOpenBSD OS, currently not officially supported

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@am11@tarekgh@janvorli
, '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('^' + ".*" + ' Add OpenBSD support for ICU library loading by am11 · Pull Request #129124 · dotnet/runtime · GitHub
Skip to content

Add OpenBSD support for ICU library loading - #129124

Merged
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading
Jun 8, 2026
Merged

Add OpenBSD support for ICU library loading#129124
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading

Conversation

@am11

@am11am11 commented Jun 8, 2026

Copy link
Copy Markdown
Member

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering. Use unversioned dlopen calls and probe symbol versioning instead of attempting to load versioned library names.

Contributes to #124911.

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering.
Use unversioned dlopen calls and probe symbol versioning instead of
attempting to load versioned library names.
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-globalization
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11am11 added the os-openbsd OpenBSD OS, currently not officially supported label Jun 8, 2026
@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

Hello world was working with the override:

am11@foo:~$ DOTNET_ICU_VERSION_OVERRIDE=22 th/artifacts/bin/testhost/net11.0-openbsd-Debug-x64/dotnet exec~/projects/hw1/hw1/bin/Debug/net11.0/hw1.dll
Hello, World!
Environment.Version: 11.0.0
RuntimeInformation.OSDescription: OpenBSD 7.8 GENERIC.MP#54

This makes it work without.

@tarekgh

Copy link
Copy Markdown
Member

Two important caveats this PR introduces

  1. The manually installed ICU must be built --disable-renaming. The OpenBSD path calls FindSymbolVersion(-1, -1, -1, ...), which only matches the unversioned u_strlen. If you drop in a stock upstream ICU build (renaming enabled → u_strlen_78), dlopen succeeds but symbol resolution returns false and ICU fails to load. So a "more recent ICU" has to be packaged the OpenBSD way (unversioned symbols), not a vanilla ./configure && make build.

  2. DOTNET_ICU_VERSION_OVERRIDE no longer works on OpenBSD after this PR. This is the subtle one. FindLibUsingOverride (which reads DOTNET_ICU_VERSION_OVERRIDE) lives only in the #else generic-Unix branch (lines 332-432). The new OpenBSD #elif branch never calls it. Pre-PR, OpenBSD fell through to #else, which is exactly why the author's DOTNET_ICU_VERSION_OVERRIDE=22 workaround worked. Post-PR, that env var is silently ignored on OpenBSD. So the one knob that let you force a particular major version on the Linux path is gone for OpenBSD — you'd have to use LD_LIBRARY_PATH or app-local ICU instead.

@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

@tarekgh, I think it’s fine to make it work with OpenBSD packaging convention in a standard install just like we have for Android (at least for the bringup). Unlike some other desktop OS, OpenBSD seem to have one package version at a time policy, pkg_info -Q icu4c reports a single v77 option, same with other packages.

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

@tarekgh

Copy link
Copy Markdown
Member

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

I am not objecting, I am just pointing out OpenBSD will be kind of special case. At least we should document the new behavior in https://learn.microsoft.com/en-us/dotnet/core/extensions/globalization-icu for completeness.

@tarekghtarekgh 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.

CC @jkotas and @janvorli if they have feedback too.

@tarekghtarekgh added this to the 11.0.0 milestone Jun 8, 2026

@janvorlijanvorli 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.

LGTM, thank you!

@tarekgh
tarekgh merged commit fdec023 into dotnet:mainJun 8, 2026
177 of 180 checks passed
@am11
am11 deleted the feature/port/openbsd-libs-loading branch June 8, 2026 21:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 10, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Globalizationcommunity-contributionIndicates that the PR has been added by a community memberos-openbsdOpenBSD OS, currently not officially supported

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@am11@tarekgh@janvorli
, '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" + ' Add OpenBSD support for ICU library loading by am11 · Pull Request #129124 · dotnet/runtime · GitHub
Skip to content

Add OpenBSD support for ICU library loading - #129124

Merged
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading
Jun 8, 2026
Merged

Add OpenBSD support for ICU library loading#129124
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading

Conversation

@am11

@am11am11 commented Jun 8, 2026

Copy link
Copy Markdown
Member

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering. Use unversioned dlopen calls and probe symbol versioning instead of attempting to load versioned library names.

Contributes to #124911.

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering.
Use unversioned dlopen calls and probe symbol versioning instead of
attempting to load versioned library names.
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-globalization
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11am11 added the os-openbsd OpenBSD OS, currently not officially supported label Jun 8, 2026
@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

Hello world was working with the override:

am11@foo:~$ DOTNET_ICU_VERSION_OVERRIDE=22 th/artifacts/bin/testhost/net11.0-openbsd-Debug-x64/dotnet exec~/projects/hw1/hw1/bin/Debug/net11.0/hw1.dll
Hello, World!
Environment.Version: 11.0.0
RuntimeInformation.OSDescription: OpenBSD 7.8 GENERIC.MP#54

This makes it work without.

@tarekgh

Copy link
Copy Markdown
Member

Two important caveats this PR introduces

  1. The manually installed ICU must be built --disable-renaming. The OpenBSD path calls FindSymbolVersion(-1, -1, -1, ...), which only matches the unversioned u_strlen. If you drop in a stock upstream ICU build (renaming enabled → u_strlen_78), dlopen succeeds but symbol resolution returns false and ICU fails to load. So a "more recent ICU" has to be packaged the OpenBSD way (unversioned symbols), not a vanilla ./configure && make build.

  2. DOTNET_ICU_VERSION_OVERRIDE no longer works on OpenBSD after this PR. This is the subtle one. FindLibUsingOverride (which reads DOTNET_ICU_VERSION_OVERRIDE) lives only in the #else generic-Unix branch (lines 332-432). The new OpenBSD #elif branch never calls it. Pre-PR, OpenBSD fell through to #else, which is exactly why the author's DOTNET_ICU_VERSION_OVERRIDE=22 workaround worked. Post-PR, that env var is silently ignored on OpenBSD. So the one knob that let you force a particular major version on the Linux path is gone for OpenBSD — you'd have to use LD_LIBRARY_PATH or app-local ICU instead.

@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

@tarekgh, I think it’s fine to make it work with OpenBSD packaging convention in a standard install just like we have for Android (at least for the bringup). Unlike some other desktop OS, OpenBSD seem to have one package version at a time policy, pkg_info -Q icu4c reports a single v77 option, same with other packages.

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

@tarekgh

Copy link
Copy Markdown
Member

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

I am not objecting, I am just pointing out OpenBSD will be kind of special case. At least we should document the new behavior in https://learn.microsoft.com/en-us/dotnet/core/extensions/globalization-icu for completeness.

@tarekghtarekgh 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.

CC @jkotas and @janvorli if they have feedback too.

@tarekghtarekgh added this to the 11.0.0 milestone Jun 8, 2026

@janvorlijanvorli 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.

LGTM, thank you!

@tarekgh
tarekgh merged commit fdec023 into dotnet:mainJun 8, 2026
177 of 180 checks passed
@am11
am11 deleted the feature/port/openbsd-libs-loading branch June 8, 2026 21:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 10, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Globalizationcommunity-contributionIndicates that the PR has been added by a community memberos-openbsdOpenBSD OS, currently not officially supported

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@am11@tarekgh@janvorli
, '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('^' + ".*" + ' Add OpenBSD support for ICU library loading by am11 · Pull Request #129124 · dotnet/runtime · GitHub
Skip to content

Add OpenBSD support for ICU library loading - #129124

Merged
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading
Jun 8, 2026
Merged

Add OpenBSD support for ICU library loading#129124
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading

Conversation

@am11

@am11am11 commented Jun 8, 2026

Copy link
Copy Markdown
Member

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering. Use unversioned dlopen calls and probe symbol versioning instead of attempting to load versioned library names.

Contributes to #124911.

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering.
Use unversioned dlopen calls and probe symbol versioning instead of
attempting to load versioned library names.
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-globalization
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11am11 added the os-openbsd OpenBSD OS, currently not officially supported label Jun 8, 2026
@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

Hello world was working with the override:

am11@foo:~$ DOTNET_ICU_VERSION_OVERRIDE=22 th/artifacts/bin/testhost/net11.0-openbsd-Debug-x64/dotnet exec~/projects/hw1/hw1/bin/Debug/net11.0/hw1.dll
Hello, World!
Environment.Version: 11.0.0
RuntimeInformation.OSDescription: OpenBSD 7.8 GENERIC.MP#54

This makes it work without.

@tarekgh

Copy link
Copy Markdown
Member

Two important caveats this PR introduces

  1. The manually installed ICU must be built --disable-renaming. The OpenBSD path calls FindSymbolVersion(-1, -1, -1, ...), which only matches the unversioned u_strlen. If you drop in a stock upstream ICU build (renaming enabled → u_strlen_78), dlopen succeeds but symbol resolution returns false and ICU fails to load. So a "more recent ICU" has to be packaged the OpenBSD way (unversioned symbols), not a vanilla ./configure && make build.

  2. DOTNET_ICU_VERSION_OVERRIDE no longer works on OpenBSD after this PR. This is the subtle one. FindLibUsingOverride (which reads DOTNET_ICU_VERSION_OVERRIDE) lives only in the #else generic-Unix branch (lines 332-432). The new OpenBSD #elif branch never calls it. Pre-PR, OpenBSD fell through to #else, which is exactly why the author's DOTNET_ICU_VERSION_OVERRIDE=22 workaround worked. Post-PR, that env var is silently ignored on OpenBSD. So the one knob that let you force a particular major version on the Linux path is gone for OpenBSD — you'd have to use LD_LIBRARY_PATH or app-local ICU instead.

@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

@tarekgh, I think it’s fine to make it work with OpenBSD packaging convention in a standard install just like we have for Android (at least for the bringup). Unlike some other desktop OS, OpenBSD seem to have one package version at a time policy, pkg_info -Q icu4c reports a single v77 option, same with other packages.

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

@tarekgh

Copy link
Copy Markdown
Member

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

I am not objecting, I am just pointing out OpenBSD will be kind of special case. At least we should document the new behavior in https://learn.microsoft.com/en-us/dotnet/core/extensions/globalization-icu for completeness.

@tarekghtarekgh 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.

CC @jkotas and @janvorli if they have feedback too.

@tarekghtarekgh added this to the 11.0.0 milestone Jun 8, 2026

@janvorlijanvorli 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.

LGTM, thank you!

@tarekgh
tarekgh merged commit fdec023 into dotnet:mainJun 8, 2026
177 of 180 checks passed
@am11
am11 deleted the feature/port/openbsd-libs-loading branch June 8, 2026 21:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 10, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Globalizationcommunity-contributionIndicates that the PR has been added by a community memberos-openbsdOpenBSD OS, currently not officially supported

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@am11@tarekgh@janvorli
, '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); } })(); })(); Add OpenBSD support for ICU library loading by am11 · Pull Request #129124 · dotnet/runtime · GitHub
Skip to content

Add OpenBSD support for ICU library loading - #129124

Merged
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading
Jun 8, 2026
Merged

Add OpenBSD support for ICU library loading#129124
tarekgh merged 3 commits into
dotnet:mainfrom
am11:feature/port/openbsd-libs-loading

Conversation

@am11

@am11am11 commented Jun 8, 2026

Copy link
Copy Markdown
Member

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering. Use unversioned dlopen calls and probe symbol versioning instead of attempting to load versioned library names.

Contributes to #124911.

OpenBSD uses ABI versioning in SONAME rather than ICU version numbering.
Use unversioned dlopen calls and probe symbol versioning instead of
attempting to load versioned library names.
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-system-globalization
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11am11 added the os-openbsd OpenBSD OS, currently not officially supported label Jun 8, 2026
@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

Hello world was working with the override:

am11@foo:~$ DOTNET_ICU_VERSION_OVERRIDE=22 th/artifacts/bin/testhost/net11.0-openbsd-Debug-x64/dotnet exec~/projects/hw1/hw1/bin/Debug/net11.0/hw1.dll
Hello, World!
Environment.Version: 11.0.0
RuntimeInformation.OSDescription: OpenBSD 7.8 GENERIC.MP#54

This makes it work without.

@tarekgh

Copy link
Copy Markdown
Member

Two important caveats this PR introduces

  1. The manually installed ICU must be built --disable-renaming. The OpenBSD path calls FindSymbolVersion(-1, -1, -1, ...), which only matches the unversioned u_strlen. If you drop in a stock upstream ICU build (renaming enabled → u_strlen_78), dlopen succeeds but symbol resolution returns false and ICU fails to load. So a "more recent ICU" has to be packaged the OpenBSD way (unversioned symbols), not a vanilla ./configure && make build.

  2. DOTNET_ICU_VERSION_OVERRIDE no longer works on OpenBSD after this PR. This is the subtle one. FindLibUsingOverride (which reads DOTNET_ICU_VERSION_OVERRIDE) lives only in the #else generic-Unix branch (lines 332-432). The new OpenBSD #elif branch never calls it. Pre-PR, OpenBSD fell through to #else, which is exactly why the author's DOTNET_ICU_VERSION_OVERRIDE=22 workaround worked. Post-PR, that env var is silently ignored on OpenBSD. So the one knob that let you force a particular major version on the Linux path is gone for OpenBSD — you'd have to use LD_LIBRARY_PATH or app-local ICU instead.

@am11

am11 commented Jun 8, 2026

Copy link
Copy Markdown
MemberAuthor

@tarekgh, I think it’s fine to make it work with OpenBSD packaging convention in a standard install just like we have for Android (at least for the bringup). Unlike some other desktop OS, OpenBSD seem to have one package version at a time policy, pkg_info -Q icu4c reports a single v77 option, same with other packages.

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

@tarekgh

Copy link
Copy Markdown
Member

If someone wants to use .NET with a custom build of ICU, they can use LD_LIBRARY_PATH or symlink type of mechanism to prioritize their copy. So far there is no use case for overriding and I intentionally left it out because it looks weird to use DOTNET_ICU_VERSION_OVERRIDE=22 because this env var refers to API/packaging version on Linux, FreeBSD and Solaris and we are supporting v60 onwards; while OpenBSD is using ABI versions in SONAME part.

I am not objecting, I am just pointing out OpenBSD will be kind of special case. At least we should document the new behavior in https://learn.microsoft.com/en-us/dotnet/core/extensions/globalization-icu for completeness.

@tarekghtarekgh 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.

CC @jkotas and @janvorli if they have feedback too.

@tarekghtarekgh added this to the 11.0.0 milestone Jun 8, 2026

@janvorlijanvorli 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.

LGTM, thank you!

@tarekgh
tarekgh merged commit fdec023 into dotnet:mainJun 8, 2026
177 of 180 checks passed
@am11
am11 deleted the feature/port/openbsd-libs-loading branch June 8, 2026 21:31
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 10, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Globalizationcommunity-contributionIndicates that the PR has been added by a community memberos-openbsdOpenBSD OS, currently not officially supported

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@am11@tarekgh@janvorli