[CMake] Add compile-time check that .so files have no undefined symbols - #8178

Merged
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols
Jun 4, 2021
Merged

[CMake] Add compile-time check that .so files have no undefined symbols#8178
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols

Conversation

@Lunderberg

Copy link
Copy Markdown
Contributor

Adds -Wl,-z,defs flag for linking libtvm.so and libtvm_runtime.so. While undefined symbols in libtvm.so would be caught by the CI as tests run, undefined symbols in libtvm_runtime.so (e.g. dependency on Target introduced in #8127, removed in #8171), would otherwise pass the CI.

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Potential reviewers: @areusch as this impacts the CI.

@areuschareusch left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

thanks for adding this, @Lunderberg . i'm supportive of this, would be great to get opinions from those who work more with external libraries cc @tqchen@junrushao1994@d-smirnov@masahi

@junrushao

Copy link
Copy Markdown
Member

I am supportive too, but we probably need to make it work (or have it disabled) on windows & macOS

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from 7fba3cb to 599cc0eCompareJune 2, 2021 18:49
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Sounds good, and that is my goal. The MSVC/Windows side should work automatically with no extra flag, since its default is to give an error on undefined symbols. For MacOS, I've updated the check to pass -undefined,error on OSX platforms, and will keep an eye on the CI to make sure that it works.

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch 4 times, most recently from c55aec6 to b2b7ce8CompareJune 3, 2021 19:28
…d symbols.
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from b2b7ce8 to 0415733CompareJune 4, 2021 00:16
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

The check now works on all systems. For MSVC, undefined symbols already result in an error, no extra flag is needed. For MacOS, the equivalent -Wl,-undefined,error flag is used. I also switched to the equivalent but more readable -Wl,--no-undefined flag on linux.

The check is applied only on libtvm.so and libtvm_runtime.so, and not to the more general CMAKE_SHARED_LINKER_FLAGS, because some of the other libraries have undefined symbols that are resolved when linking against the tvm libraries.

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

Thanks @Lunderberg!

Comment threadCMakeLists.txt
else()
set(TVM_NO_UNDEFINED_SYMBOLS "-Wl,--no-undefined")
endif()
message(STATUS "Forbidding undefined symbols in shared library, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: this could be confusing to a user if BUILD_STATIC_RUNTIME is set

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.

Hmm, good point. The flag is applied to both libtvm.so and (if it is being built), libtvm_runtime.so, so I wouldn't want to drop the message entirely for a static runtime build. What are your thoughts on the following phrasing?

"Forbidding undefined symbols in shared libraries libtvm and (if applicable) libtvm_runtime, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

oh oops, i meant to resolve this first but got trigger happy. i don't mind that phrasing, but since it applies in all cases, i think it's probably fine as-is too.

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.

Sounds good, and I'll keep it as is for now. Added an item to my todo list to update it later, but low priority since the as-is phrasing also works.

@areusch

Copy link
Copy Markdown
Contributor

@Lunderberg great! I think we can merge this, I have one nit that I'm not sure if you prefer to address. if you don't have cycles for that right now, i think we should just merge--the message does say "forbidding undefined symbols in shared library"

@junrushao

Copy link
Copy Markdown
Member

@Lunderberg BTW, maybe out of the scope of this PR, just curious which libraries will have undefined symbols (other than libtvm and libtvm_runtime)?

@d-smirnovd-smirnov left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks legitimate to me. Thanks @Lunderberg

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

@junrushao1994 I think it was the vta-hw build, though I'd have to tinker with it a bit to reproduce the failure.

@areusch
areusch merged commit 3e34e11 into apache:mainJun 4, 2021
@Lunderberg
Lunderberg deleted the tvm_runtime_so_forbid_undefined_symbols branch June 7, 2021 17:29
trevor-m pushed a commit to trevor-m/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
trevor-m pushed a commit to neo-ai/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
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.

4 participants

@Lunderberg@junrushao@areusch@d-smirnov
, '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

[CMake] Add compile-time check that .so files have no undefined symbols - #8178

Merged
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols
Jun 4, 2021
Merged

[CMake] Add compile-time check that .so files have no undefined symbols#8178
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols

Conversation

@Lunderberg

Copy link
Copy Markdown
Contributor

Adds -Wl,-z,defs flag for linking libtvm.so and libtvm_runtime.so. While undefined symbols in libtvm.so would be caught by the CI as tests run, undefined symbols in libtvm_runtime.so (e.g. dependency on Target introduced in #8127, removed in #8171), would otherwise pass the CI.

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Potential reviewers: @areusch as this impacts the CI.

@areuschareusch left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

thanks for adding this, @Lunderberg . i'm supportive of this, would be great to get opinions from those who work more with external libraries cc @tqchen@junrushao1994@d-smirnov@masahi

@junrushao

Copy link
Copy Markdown
Member

I am supportive too, but we probably need to make it work (or have it disabled) on windows & macOS

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from 7fba3cb to 599cc0eCompareJune 2, 2021 18:49
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Sounds good, and that is my goal. The MSVC/Windows side should work automatically with no extra flag, since its default is to give an error on undefined symbols. For MacOS, I've updated the check to pass -undefined,error on OSX platforms, and will keep an eye on the CI to make sure that it works.

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch 4 times, most recently from c55aec6 to b2b7ce8CompareJune 3, 2021 19:28
…d symbols.
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from b2b7ce8 to 0415733CompareJune 4, 2021 00:16
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

The check now works on all systems. For MSVC, undefined symbols already result in an error, no extra flag is needed. For MacOS, the equivalent -Wl,-undefined,error flag is used. I also switched to the equivalent but more readable -Wl,--no-undefined flag on linux.

The check is applied only on libtvm.so and libtvm_runtime.so, and not to the more general CMAKE_SHARED_LINKER_FLAGS, because some of the other libraries have undefined symbols that are resolved when linking against the tvm libraries.

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

Thanks @Lunderberg!

Comment threadCMakeLists.txt
else()
set(TVM_NO_UNDEFINED_SYMBOLS "-Wl,--no-undefined")
endif()
message(STATUS "Forbidding undefined symbols in shared library, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: this could be confusing to a user if BUILD_STATIC_RUNTIME is set

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.

Hmm, good point. The flag is applied to both libtvm.so and (if it is being built), libtvm_runtime.so, so I wouldn't want to drop the message entirely for a static runtime build. What are your thoughts on the following phrasing?

"Forbidding undefined symbols in shared libraries libtvm and (if applicable) libtvm_runtime, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

oh oops, i meant to resolve this first but got trigger happy. i don't mind that phrasing, but since it applies in all cases, i think it's probably fine as-is too.

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.

Sounds good, and I'll keep it as is for now. Added an item to my todo list to update it later, but low priority since the as-is phrasing also works.

@areusch

Copy link
Copy Markdown
Contributor

@Lunderberg great! I think we can merge this, I have one nit that I'm not sure if you prefer to address. if you don't have cycles for that right now, i think we should just merge--the message does say "forbidding undefined symbols in shared library"

@junrushao

Copy link
Copy Markdown
Member

@Lunderberg BTW, maybe out of the scope of this PR, just curious which libraries will have undefined symbols (other than libtvm and libtvm_runtime)?

@d-smirnovd-smirnov left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks legitimate to me. Thanks @Lunderberg

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

@junrushao1994 I think it was the vta-hw build, though I'd have to tinker with it a bit to reproduce the failure.

@areusch
areusch merged commit 3e34e11 into apache:mainJun 4, 2021
@Lunderberg
Lunderberg deleted the tvm_runtime_so_forbid_undefined_symbols branch June 7, 2021 17:29
trevor-m pushed a commit to trevor-m/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
trevor-m pushed a commit to neo-ai/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
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.

4 participants

@Lunderberg@junrushao@areusch@d-smirnov
, '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

[CMake] Add compile-time check that .so files have no undefined symbols - #8178

Merged
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols
Jun 4, 2021
Merged

[CMake] Add compile-time check that .so files have no undefined symbols#8178
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols

Conversation

@Lunderberg

Copy link
Copy Markdown
Contributor

Adds -Wl,-z,defs flag for linking libtvm.so and libtvm_runtime.so. While undefined symbols in libtvm.so would be caught by the CI as tests run, undefined symbols in libtvm_runtime.so (e.g. dependency on Target introduced in #8127, removed in #8171), would otherwise pass the CI.

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Potential reviewers: @areusch as this impacts the CI.

@areuschareusch left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

thanks for adding this, @Lunderberg . i'm supportive of this, would be great to get opinions from those who work more with external libraries cc @tqchen@junrushao1994@d-smirnov@masahi

@junrushao

Copy link
Copy Markdown
Member

I am supportive too, but we probably need to make it work (or have it disabled) on windows & macOS

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from 7fba3cb to 599cc0eCompareJune 2, 2021 18:49
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Sounds good, and that is my goal. The MSVC/Windows side should work automatically with no extra flag, since its default is to give an error on undefined symbols. For MacOS, I've updated the check to pass -undefined,error on OSX platforms, and will keep an eye on the CI to make sure that it works.

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch 4 times, most recently from c55aec6 to b2b7ce8CompareJune 3, 2021 19:28
…d symbols.
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from b2b7ce8 to 0415733CompareJune 4, 2021 00:16
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

The check now works on all systems. For MSVC, undefined symbols already result in an error, no extra flag is needed. For MacOS, the equivalent -Wl,-undefined,error flag is used. I also switched to the equivalent but more readable -Wl,--no-undefined flag on linux.

The check is applied only on libtvm.so and libtvm_runtime.so, and not to the more general CMAKE_SHARED_LINKER_FLAGS, because some of the other libraries have undefined symbols that are resolved when linking against the tvm libraries.

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

Thanks @Lunderberg!

Comment threadCMakeLists.txt
else()
set(TVM_NO_UNDEFINED_SYMBOLS "-Wl,--no-undefined")
endif()
message(STATUS "Forbidding undefined symbols in shared library, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: this could be confusing to a user if BUILD_STATIC_RUNTIME is set

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.

Hmm, good point. The flag is applied to both libtvm.so and (if it is being built), libtvm_runtime.so, so I wouldn't want to drop the message entirely for a static runtime build. What are your thoughts on the following phrasing?

"Forbidding undefined symbols in shared libraries libtvm and (if applicable) libtvm_runtime, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

oh oops, i meant to resolve this first but got trigger happy. i don't mind that phrasing, but since it applies in all cases, i think it's probably fine as-is too.

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.

Sounds good, and I'll keep it as is for now. Added an item to my todo list to update it later, but low priority since the as-is phrasing also works.

@areusch

Copy link
Copy Markdown
Contributor

@Lunderberg great! I think we can merge this, I have one nit that I'm not sure if you prefer to address. if you don't have cycles for that right now, i think we should just merge--the message does say "forbidding undefined symbols in shared library"

@junrushao

Copy link
Copy Markdown
Member

@Lunderberg BTW, maybe out of the scope of this PR, just curious which libraries will have undefined symbols (other than libtvm and libtvm_runtime)?

@d-smirnovd-smirnov left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks legitimate to me. Thanks @Lunderberg

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

@junrushao1994 I think it was the vta-hw build, though I'd have to tinker with it a bit to reproduce the failure.

@areusch
areusch merged commit 3e34e11 into apache:mainJun 4, 2021
@Lunderberg
Lunderberg deleted the tvm_runtime_so_forbid_undefined_symbols branch June 7, 2021 17:29
trevor-m pushed a commit to trevor-m/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
trevor-m pushed a commit to neo-ai/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
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.

4 participants

@Lunderberg@junrushao@areusch@d-smirnov
, '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

[CMake] Add compile-time check that .so files have no undefined symbols - #8178

Merged
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols
Jun 4, 2021
Merged

[CMake] Add compile-time check that .so files have no undefined symbols#8178
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols

Conversation

@Lunderberg

Copy link
Copy Markdown
Contributor

Adds -Wl,-z,defs flag for linking libtvm.so and libtvm_runtime.so. While undefined symbols in libtvm.so would be caught by the CI as tests run, undefined symbols in libtvm_runtime.so (e.g. dependency on Target introduced in #8127, removed in #8171), would otherwise pass the CI.

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Potential reviewers: @areusch as this impacts the CI.

@areuschareusch left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

thanks for adding this, @Lunderberg . i'm supportive of this, would be great to get opinions from those who work more with external libraries cc @tqchen@junrushao1994@d-smirnov@masahi

@junrushao

Copy link
Copy Markdown
Member

I am supportive too, but we probably need to make it work (or have it disabled) on windows & macOS

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from 7fba3cb to 599cc0eCompareJune 2, 2021 18:49
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Sounds good, and that is my goal. The MSVC/Windows side should work automatically with no extra flag, since its default is to give an error on undefined symbols. For MacOS, I've updated the check to pass -undefined,error on OSX platforms, and will keep an eye on the CI to make sure that it works.

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch 4 times, most recently from c55aec6 to b2b7ce8CompareJune 3, 2021 19:28
…d symbols.
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from b2b7ce8 to 0415733CompareJune 4, 2021 00:16
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

The check now works on all systems. For MSVC, undefined symbols already result in an error, no extra flag is needed. For MacOS, the equivalent -Wl,-undefined,error flag is used. I also switched to the equivalent but more readable -Wl,--no-undefined flag on linux.

The check is applied only on libtvm.so and libtvm_runtime.so, and not to the more general CMAKE_SHARED_LINKER_FLAGS, because some of the other libraries have undefined symbols that are resolved when linking against the tvm libraries.

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

Thanks @Lunderberg!

Comment threadCMakeLists.txt
else()
set(TVM_NO_UNDEFINED_SYMBOLS "-Wl,--no-undefined")
endif()
message(STATUS "Forbidding undefined symbols in shared library, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: this could be confusing to a user if BUILD_STATIC_RUNTIME is set

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.

Hmm, good point. The flag is applied to both libtvm.so and (if it is being built), libtvm_runtime.so, so I wouldn't want to drop the message entirely for a static runtime build. What are your thoughts on the following phrasing?

"Forbidding undefined symbols in shared libraries libtvm and (if applicable) libtvm_runtime, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

oh oops, i meant to resolve this first but got trigger happy. i don't mind that phrasing, but since it applies in all cases, i think it's probably fine as-is too.

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.

Sounds good, and I'll keep it as is for now. Added an item to my todo list to update it later, but low priority since the as-is phrasing also works.

@areusch

Copy link
Copy Markdown
Contributor

@Lunderberg great! I think we can merge this, I have one nit that I'm not sure if you prefer to address. if you don't have cycles for that right now, i think we should just merge--the message does say "forbidding undefined symbols in shared library"

@junrushao

Copy link
Copy Markdown
Member

@Lunderberg BTW, maybe out of the scope of this PR, just curious which libraries will have undefined symbols (other than libtvm and libtvm_runtime)?

@d-smirnovd-smirnov left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks legitimate to me. Thanks @Lunderberg

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

@junrushao1994 I think it was the vta-hw build, though I'd have to tinker with it a bit to reproduce the failure.

@areusch
areusch merged commit 3e34e11 into apache:mainJun 4, 2021
@Lunderberg
Lunderberg deleted the tvm_runtime_so_forbid_undefined_symbols branch June 7, 2021 17:29
trevor-m pushed a commit to trevor-m/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
trevor-m pushed a commit to neo-ai/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
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.

4 participants

@Lunderberg@junrushao@areusch@d-smirnov
, '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

[CMake] Add compile-time check that .so files have no undefined symbols - #8178

Merged
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols
Jun 4, 2021
Merged

[CMake] Add compile-time check that .so files have no undefined symbols#8178
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols

Conversation

@Lunderberg

Copy link
Copy Markdown
Contributor

Adds -Wl,-z,defs flag for linking libtvm.so and libtvm_runtime.so. While undefined symbols in libtvm.so would be caught by the CI as tests run, undefined symbols in libtvm_runtime.so (e.g. dependency on Target introduced in #8127, removed in #8171), would otherwise pass the CI.

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Potential reviewers: @areusch as this impacts the CI.

@areuschareusch left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

thanks for adding this, @Lunderberg . i'm supportive of this, would be great to get opinions from those who work more with external libraries cc @tqchen@junrushao1994@d-smirnov@masahi

@junrushao

Copy link
Copy Markdown
Member

I am supportive too, but we probably need to make it work (or have it disabled) on windows & macOS

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from 7fba3cb to 599cc0eCompareJune 2, 2021 18:49
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Sounds good, and that is my goal. The MSVC/Windows side should work automatically with no extra flag, since its default is to give an error on undefined symbols. For MacOS, I've updated the check to pass -undefined,error on OSX platforms, and will keep an eye on the CI to make sure that it works.

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch 4 times, most recently from c55aec6 to b2b7ce8CompareJune 3, 2021 19:28
…d symbols.
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from b2b7ce8 to 0415733CompareJune 4, 2021 00:16
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

The check now works on all systems. For MSVC, undefined symbols already result in an error, no extra flag is needed. For MacOS, the equivalent -Wl,-undefined,error flag is used. I also switched to the equivalent but more readable -Wl,--no-undefined flag on linux.

The check is applied only on libtvm.so and libtvm_runtime.so, and not to the more general CMAKE_SHARED_LINKER_FLAGS, because some of the other libraries have undefined symbols that are resolved when linking against the tvm libraries.

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

Thanks @Lunderberg!

Comment threadCMakeLists.txt
else()
set(TVM_NO_UNDEFINED_SYMBOLS "-Wl,--no-undefined")
endif()
message(STATUS "Forbidding undefined symbols in shared library, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: this could be confusing to a user if BUILD_STATIC_RUNTIME is set

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.

Hmm, good point. The flag is applied to both libtvm.so and (if it is being built), libtvm_runtime.so, so I wouldn't want to drop the message entirely for a static runtime build. What are your thoughts on the following phrasing?

"Forbidding undefined symbols in shared libraries libtvm and (if applicable) libtvm_runtime, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

oh oops, i meant to resolve this first but got trigger happy. i don't mind that phrasing, but since it applies in all cases, i think it's probably fine as-is too.

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.

Sounds good, and I'll keep it as is for now. Added an item to my todo list to update it later, but low priority since the as-is phrasing also works.

@areusch

Copy link
Copy Markdown
Contributor

@Lunderberg great! I think we can merge this, I have one nit that I'm not sure if you prefer to address. if you don't have cycles for that right now, i think we should just merge--the message does say "forbidding undefined symbols in shared library"

@junrushao

Copy link
Copy Markdown
Member

@Lunderberg BTW, maybe out of the scope of this PR, just curious which libraries will have undefined symbols (other than libtvm and libtvm_runtime)?

@d-smirnovd-smirnov left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks legitimate to me. Thanks @Lunderberg

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

@junrushao1994 I think it was the vta-hw build, though I'd have to tinker with it a bit to reproduce the failure.

@areusch
areusch merged commit 3e34e11 into apache:mainJun 4, 2021
@Lunderberg
Lunderberg deleted the tvm_runtime_so_forbid_undefined_symbols branch June 7, 2021 17:29
trevor-m pushed a commit to trevor-m/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
trevor-m pushed a commit to neo-ai/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
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.

4 participants

@Lunderberg@junrushao@areusch@d-smirnov
, '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

[CMake] Add compile-time check that .so files have no undefined symbols - #8178

Merged
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols
Jun 4, 2021
Merged

[CMake] Add compile-time check that .so files have no undefined symbols#8178
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols

Conversation

@Lunderberg

Copy link
Copy Markdown
Contributor

Adds -Wl,-z,defs flag for linking libtvm.so and libtvm_runtime.so. While undefined symbols in libtvm.so would be caught by the CI as tests run, undefined symbols in libtvm_runtime.so (e.g. dependency on Target introduced in #8127, removed in #8171), would otherwise pass the CI.

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Potential reviewers: @areusch as this impacts the CI.

@areuschareusch left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

thanks for adding this, @Lunderberg . i'm supportive of this, would be great to get opinions from those who work more with external libraries cc @tqchen@junrushao1994@d-smirnov@masahi

@junrushao

Copy link
Copy Markdown
Member

I am supportive too, but we probably need to make it work (or have it disabled) on windows & macOS

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from 7fba3cb to 599cc0eCompareJune 2, 2021 18:49
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Sounds good, and that is my goal. The MSVC/Windows side should work automatically with no extra flag, since its default is to give an error on undefined symbols. For MacOS, I've updated the check to pass -undefined,error on OSX platforms, and will keep an eye on the CI to make sure that it works.

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch 4 times, most recently from c55aec6 to b2b7ce8CompareJune 3, 2021 19:28
…d symbols.
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from b2b7ce8 to 0415733CompareJune 4, 2021 00:16
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

The check now works on all systems. For MSVC, undefined symbols already result in an error, no extra flag is needed. For MacOS, the equivalent -Wl,-undefined,error flag is used. I also switched to the equivalent but more readable -Wl,--no-undefined flag on linux.

The check is applied only on libtvm.so and libtvm_runtime.so, and not to the more general CMAKE_SHARED_LINKER_FLAGS, because some of the other libraries have undefined symbols that are resolved when linking against the tvm libraries.

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

Thanks @Lunderberg!

Comment threadCMakeLists.txt
else()
set(TVM_NO_UNDEFINED_SYMBOLS "-Wl,--no-undefined")
endif()
message(STATUS "Forbidding undefined symbols in shared library, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: this could be confusing to a user if BUILD_STATIC_RUNTIME is set

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.

Hmm, good point. The flag is applied to both libtvm.so and (if it is being built), libtvm_runtime.so, so I wouldn't want to drop the message entirely for a static runtime build. What are your thoughts on the following phrasing?

"Forbidding undefined symbols in shared libraries libtvm and (if applicable) libtvm_runtime, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

oh oops, i meant to resolve this first but got trigger happy. i don't mind that phrasing, but since it applies in all cases, i think it's probably fine as-is too.

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.

Sounds good, and I'll keep it as is for now. Added an item to my todo list to update it later, but low priority since the as-is phrasing also works.

@areusch

Copy link
Copy Markdown
Contributor

@Lunderberg great! I think we can merge this, I have one nit that I'm not sure if you prefer to address. if you don't have cycles for that right now, i think we should just merge--the message does say "forbidding undefined symbols in shared library"

@junrushao

Copy link
Copy Markdown
Member

@Lunderberg BTW, maybe out of the scope of this PR, just curious which libraries will have undefined symbols (other than libtvm and libtvm_runtime)?

@d-smirnovd-smirnov left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks legitimate to me. Thanks @Lunderberg

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

@junrushao1994 I think it was the vta-hw build, though I'd have to tinker with it a bit to reproduce the failure.

@areusch
areusch merged commit 3e34e11 into apache:mainJun 4, 2021
@Lunderberg
Lunderberg deleted the tvm_runtime_so_forbid_undefined_symbols branch June 7, 2021 17:29
trevor-m pushed a commit to trevor-m/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
trevor-m pushed a commit to neo-ai/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
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.

4 participants

@Lunderberg@junrushao@areusch@d-smirnov
, '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

[CMake] Add compile-time check that .so files have no undefined symbols - #8178

Merged
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols
Jun 4, 2021
Merged

[CMake] Add compile-time check that .so files have no undefined symbols#8178
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols

Conversation

@Lunderberg

Copy link
Copy Markdown
Contributor

Adds -Wl,-z,defs flag for linking libtvm.so and libtvm_runtime.so. While undefined symbols in libtvm.so would be caught by the CI as tests run, undefined symbols in libtvm_runtime.so (e.g. dependency on Target introduced in #8127, removed in #8171), would otherwise pass the CI.

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Potential reviewers: @areusch as this impacts the CI.

@areuschareusch left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

thanks for adding this, @Lunderberg . i'm supportive of this, would be great to get opinions from those who work more with external libraries cc @tqchen@junrushao1994@d-smirnov@masahi

@junrushao

Copy link
Copy Markdown
Member

I am supportive too, but we probably need to make it work (or have it disabled) on windows & macOS

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from 7fba3cb to 599cc0eCompareJune 2, 2021 18:49
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Sounds good, and that is my goal. The MSVC/Windows side should work automatically with no extra flag, since its default is to give an error on undefined symbols. For MacOS, I've updated the check to pass -undefined,error on OSX platforms, and will keep an eye on the CI to make sure that it works.

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch 4 times, most recently from c55aec6 to b2b7ce8CompareJune 3, 2021 19:28
…d symbols.
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from b2b7ce8 to 0415733CompareJune 4, 2021 00:16
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

The check now works on all systems. For MSVC, undefined symbols already result in an error, no extra flag is needed. For MacOS, the equivalent -Wl,-undefined,error flag is used. I also switched to the equivalent but more readable -Wl,--no-undefined flag on linux.

The check is applied only on libtvm.so and libtvm_runtime.so, and not to the more general CMAKE_SHARED_LINKER_FLAGS, because some of the other libraries have undefined symbols that are resolved when linking against the tvm libraries.

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

Thanks @Lunderberg!

Comment threadCMakeLists.txt
else()
set(TVM_NO_UNDEFINED_SYMBOLS "-Wl,--no-undefined")
endif()
message(STATUS "Forbidding undefined symbols in shared library, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: this could be confusing to a user if BUILD_STATIC_RUNTIME is set

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.

Hmm, good point. The flag is applied to both libtvm.so and (if it is being built), libtvm_runtime.so, so I wouldn't want to drop the message entirely for a static runtime build. What are your thoughts on the following phrasing?

"Forbidding undefined symbols in shared libraries libtvm and (if applicable) libtvm_runtime, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

oh oops, i meant to resolve this first but got trigger happy. i don't mind that phrasing, but since it applies in all cases, i think it's probably fine as-is too.

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.

Sounds good, and I'll keep it as is for now. Added an item to my todo list to update it later, but low priority since the as-is phrasing also works.

@areusch

Copy link
Copy Markdown
Contributor

@Lunderberg great! I think we can merge this, I have one nit that I'm not sure if you prefer to address. if you don't have cycles for that right now, i think we should just merge--the message does say "forbidding undefined symbols in shared library"

@junrushao

Copy link
Copy Markdown
Member

@Lunderberg BTW, maybe out of the scope of this PR, just curious which libraries will have undefined symbols (other than libtvm and libtvm_runtime)?

@d-smirnovd-smirnov left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks legitimate to me. Thanks @Lunderberg

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

@junrushao1994 I think it was the vta-hw build, though I'd have to tinker with it a bit to reproduce the failure.

@areusch
areusch merged commit 3e34e11 into apache:mainJun 4, 2021
@Lunderberg
Lunderberg deleted the tvm_runtime_so_forbid_undefined_symbols branch June 7, 2021 17:29
trevor-m pushed a commit to trevor-m/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
trevor-m pushed a commit to neo-ai/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
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.

4 participants

@Lunderberg@junrushao@areusch@d-smirnov
, '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

[CMake] Add compile-time check that .so files have no undefined symbols - #8178

Merged
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols
Jun 4, 2021
Merged

[CMake] Add compile-time check that .so files have no undefined symbols#8178
areusch merged 1 commit into
apache:mainfrom
Lunderberg:tvm_runtime_so_forbid_undefined_symbols

Conversation

@Lunderberg

Copy link
Copy Markdown
Contributor

Adds -Wl,-z,defs flag for linking libtvm.so and libtvm_runtime.so. While undefined symbols in libtvm.so would be caught by the CI as tests run, undefined symbols in libtvm_runtime.so (e.g. dependency on Target introduced in #8127, removed in #8171), would otherwise pass the CI.

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Potential reviewers: @areusch as this impacts the CI.

@areuschareusch left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

thanks for adding this, @Lunderberg . i'm supportive of this, would be great to get opinions from those who work more with external libraries cc @tqchen@junrushao1994@d-smirnov@masahi

@junrushao

Copy link
Copy Markdown
Member

I am supportive too, but we probably need to make it work (or have it disabled) on windows & macOS

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from 7fba3cb to 599cc0eCompareJune 2, 2021 18:49
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

Sounds good, and that is my goal. The MSVC/Windows side should work automatically with no extra flag, since its default is to give an error on undefined symbols. For MacOS, I've updated the check to pass -undefined,error on OSX platforms, and will keep an eye on the CI to make sure that it works.

@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch 4 times, most recently from c55aec6 to b2b7ce8CompareJune 3, 2021 19:28
…d symbols.
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
@Lunderberg
Lunderbergforce-pushed the tvm_runtime_so_forbid_undefined_symbols branch from b2b7ce8 to 0415733CompareJune 4, 2021 00:16
@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

The check now works on all systems. For MSVC, undefined symbols already result in an error, no extra flag is needed. For MacOS, the equivalent -Wl,-undefined,error flag is used. I also switched to the equivalent but more readable -Wl,--no-undefined flag on linux.

The check is applied only on libtvm.so and libtvm_runtime.so, and not to the more general CMAKE_SHARED_LINKER_FLAGS, because some of the other libraries have undefined symbols that are resolved when linking against the tvm libraries.

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

Thanks @Lunderberg!

Comment threadCMakeLists.txt
else()
set(TVM_NO_UNDEFINED_SYMBOLS "-Wl,--no-undefined")
endif()
message(STATUS "Forbidding undefined symbols in shared library, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: this could be confusing to a user if BUILD_STATIC_RUNTIME is set

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.

Hmm, good point. The flag is applied to both libtvm.so and (if it is being built), libtvm_runtime.so, so I wouldn't want to drop the message entirely for a static runtime build. What are your thoughts on the following phrasing?

"Forbidding undefined symbols in shared libraries libtvm and (if applicable) libtvm_runtime, using ${TVM_NO_UNDEFINED_SYMBOLS} on platform ${CMAKE_SYSTEM_NAME}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

oh oops, i meant to resolve this first but got trigger happy. i don't mind that phrasing, but since it applies in all cases, i think it's probably fine as-is too.

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.

Sounds good, and I'll keep it as is for now. Added an item to my todo list to update it later, but low priority since the as-is phrasing also works.

@areusch

Copy link
Copy Markdown
Contributor

@Lunderberg great! I think we can merge this, I have one nit that I'm not sure if you prefer to address. if you don't have cycles for that right now, i think we should just merge--the message does say "forbidding undefined symbols in shared library"

@junrushao

Copy link
Copy Markdown
Member

@Lunderberg BTW, maybe out of the scope of this PR, just curious which libraries will have undefined symbols (other than libtvm and libtvm_runtime)?

@d-smirnovd-smirnov left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks legitimate to me. Thanks @Lunderberg

@Lunderberg

Copy link
Copy Markdown
ContributorAuthor

@junrushao1994 I think it was the vta-hw build, though I'd have to tinker with it a bit to reproduce the failure.

@areusch
areusch merged commit 3e34e11 into apache:mainJun 4, 2021
@Lunderberg
Lunderberg deleted the tvm_runtime_so_forbid_undefined_symbols branch June 7, 2021 17:29
trevor-m pushed a commit to trevor-m/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
trevor-m pushed a commit to neo-ai/tvm that referenced this pull request Jun 17, 2021
…d symbols. (apache#8178)
If libtvm_runtime.so erroneously requires definitions that are only
present in libtvm.so, the -Wl,--no-undefined flag forces them to be
compile-time errors rather than runtime, and would be caught by the
CI.
Co-authored-by: Eric Lunderberg <elunderberg@octoml.ai>
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.

4 participants

@Lunderberg@junrushao@areusch@d-smirnov