diff mbox series

llvm: enable LLVMgold.so build by adding binutils dependency

Message ID 20260113225424.1208879-1-mark.yang@lge.com
State New
Headers show
Series llvm: enable LLVMgold.so build by adding binutils dependency | expand

Commit Message

mark.yang Jan. 13, 2026, 10:54 p.m. UTC
From: "mark.yang" <mark.yang@lge.com>

Currently, LLVMgold.so is not built because the binutils headers
are missing during the build process.

This allows LLVM to find the necessary headers and build the LLVMgold.so,
which is required for Link Time Optimization (LTO) support properly.

Signed-off-by: mark.yang <mark.yang@lge.com>
---
 meta/recipes-devtools/clang/llvm_git.bb | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

mark.yang Jan. 13, 2026, 11:17 p.m. UTC | #1
This patch is intended for recipes that use the bfd linker instead of the lld linker when using LTO in a clang environment.

In Yocto scarthgap, this option was enabled, allowing LTO to be used even when using clang + LTO + bfd linker.
While the lld linker does not require a plugin, the following plugins are required when using the bfd linker.
LLVMgold.so, libLTO.so

We can reproduce the build by adding the following options to your local.conf:
PREFERRED_TOOLCHAIN_TARGET = "clang"
DISTRO_FEATURES:append = " ld-is-lld"
require conf/distro/include/lto.inc
DISTRO_FEATURES:append = " lto"
# The settings below were taken from meta-clang.
LTO:toolchain-clang:class-target = "${@bb.utils.contains('DISTRO_FEATURES', 'thin-lto', '-flto=thin', '-flto -fuse-ld=lld', d)}"
LTO:toolchain-clang:class-nativesdk = "${@bb.utils.contains('DISTRO_FEATURES', 'thin-lto', '-flto=thin', '-flto -fuse-ld=lld', d)}"

For example, components such as zlib force the use of the bfd linker. ( https://github.com/openembedded/openembedded-core/commit/be5856616aee1d2134e6aedefc5fe664ad5e2a7d )
In this case, it causes the following error when building zlib: ( https://errors.yoctoproject.org/Errors/Details/895736/ )
usr/bin/aarch64-oe-linux/../lib/LLVMgold.so: cannot open shared object file: No such file or directory
`/usr/bin/lib/LLVMgold.so` is a very strange path, but this is an issue to be investigated further later. (This occurs because the clang binary is located in `/usr/bin/aarch64-oe-linux`, and the plugin searches for it using a relative path from clang's current location.)

In fact, LLVMgold.so does not exist in the sysroot.
bitbake/bitbake-builds/oe-nodistro-master-nodistro-machine_qemuarm64/build/tmp/sysroots-components $ find ./ -name "*LLVMgold*"
# nothing
bitbake/bitbake-builds/oe-nodistro-master-nodistro-machine_qemuarm64/build/tmp/sysroots-components $ find ./ -name "*libLTO*"
# nothing
To produce this, the following configuration is required in the llvm recipe.
DEPENDS += "binutils"
EXTRA_OECMAKE += "-DLLVM_BINUTILS_INCDIR= ${STAGING_INCDIR} "
It existed in the clang recipe for scarthgap, but was omitted in commit https://github.com/openembedded/openembedded-core/commit/d76dc362c8e18779cc4ddc6a778fb423c0e66a65.
It seems this was missed during the process of streamlining the clang build and separating the clang and llvm recipes.

However, the following configuration already exists in llvm_git.bb.
70: PACKAGECONFIG:remove:class-native = "lto thin-lto"
81: PACKAGECONFIG[lto] = "-DLLVM_ENABLE_LTO=Full -DLLVM_BINUTILS_INCDIR= ${STAGING_INCDIR} ,,binutils,"
82: PACKAGECONFIG[thin-lto] = "-DLLVM_ENABLE_LTO=Thin -DLLVM_BINUTILS_INCDIR= ${STAGING_INCDIR} ,,binutils,"
The `lto` and `thin-lto` settings in `PACKAGECONFIG` determine whether LTO (Link Time Optimization) will be applied to LLVM itself.
Furthermore, for `llvm-native`, `lto` or `thin-lto` settings in `PACKAGECONFIG` are never applied because they are explicitly removed.
PACKAGECONFIG:remove:class-native = "lto thin-lto" was added in https://github.com/openembedded/openembedded-core/commit/d76dc362c8e18779cc4ddc6a778fb423c0e66a65.
It seems that the use of LTO for LLVM/Clang itself is being avoided to reduce the increase in build time, which is a known disadvantage of LTO.

Even if LLVM/Clang itself does not use LTO, I want to enable LTO for components that are built using LLVM/Clang.
Therefore, providing the necessary tools (LLVMgold.so, libLTO.so) in the sysroot seems appropriate.

Building with this configuration will provide the following files in the sysroot:
bitbake/bitbake-builds/oe-nodistro-master-nodistro-machine_qemuarm64/build/tmp/sysroots-components $ find . -name "*LLVMgold*"
./x86_64/llvm-native/usr/lib/LLVMgold.so
bitbake/bitbake-builds/oe-nodistro-master-nodistro-machine_qemuarm64/build/tmp/sysroots-components $ find . -name "*libLTO*"
./x86_64/llvm-native/usr/lib/libLTO.so.21.1
./x86_64/llvm-native/usr/lib/libLTO.so

Even after this patch, zlib will still fail with an error as it cannot find the path to LLVMgold.so.
However, this should be addressed in a future patch.
As mentioned above, because the clang binary is copied to the usr/bin/aarch64-oe-linux/ location and provided to the sysroot, the relative path used to locate the plugin is incorrect.
Khem Raj Jan. 14, 2026, 12:21 a.m. UTC | #2
This is a good fix, I was seeing the same problems.

On Tue, Jan 13, 2026 at 2:54 PM mark.yang via lists.openembedded.org
<mark.yang=lge.com@lists.openembedded.org> wrote:

> From: "mark.yang" <mark.yang@lge.com>
>
> Currently, LLVMgold.so is not built because the binutils headers
> are missing during the build process.
>
> This allows LLVM to find the necessary headers and build the LLVMgold.so,
> which is required for Link Time Optimization (LTO) support properly.
>
> Signed-off-by: mark.yang <mark.yang@lge.com>
> ---
>  meta/recipes-devtools/clang/llvm_git.bb | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/meta/recipes-devtools/clang/llvm_git.bb
> b/meta/recipes-devtools/clang/llvm_git.bb
> index 96ea383731..bed9988c1a 100644
> --- a/meta/recipes-devtools/clang/llvm_git.bb
> +++ b/meta/recipes-devtools/clang/llvm_git.bb
> @@ -11,7 +11,7 @@ require common-source.inc
>
>  LIC_FILES_CHKSUM =
> "file://LICENSE.TXT;md5=8a15a0759ef07f2682d2ba4b893c9afe"
>
> -DEPENDS = "llvm-tblgen-native libffi libxml2 zlib zstd"
> +DEPENDS = "llvm-tblgen-native libffi libxml2 zlib zstd binutils"
>
>  inherit cmake pkgconfig lib_package multilib_header
>
> @@ -50,6 +50,7 @@ EXTRA_OECMAKE += "-DCMAKE_BUILD_TYPE=MinSizeRel \
>                    -DLLVM_TOOL_YAML2OBJ_BUILD=OFF \
>                    -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \
>                    -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \
> +                  -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR} \
>
>  -DCROSS_TOOLCHAIN_FLAGS_NATIVE='-DCMAKE_TOOLCHAIN_FILE=${WORKDIR}/toolchain-native.cmake'
> \
>                   "
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#229292):
> https://lists.openembedded.org/g/openembedded-core/message/229292
> Mute This Topic: https://lists.openembedded.org/mt/117252728/1997914
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
> raj.khem@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
diff mbox series

Patch

diff --git a/meta/recipes-devtools/clang/llvm_git.bb b/meta/recipes-devtools/clang/llvm_git.bb
index 96ea383731..bed9988c1a 100644
--- a/meta/recipes-devtools/clang/llvm_git.bb
+++ b/meta/recipes-devtools/clang/llvm_git.bb
@@ -11,7 +11,7 @@  require common-source.inc
 
 LIC_FILES_CHKSUM = "file://LICENSE.TXT;md5=8a15a0759ef07f2682d2ba4b893c9afe"
 
-DEPENDS = "llvm-tblgen-native libffi libxml2 zlib zstd"
+DEPENDS = "llvm-tblgen-native libffi libxml2 zlib zstd binutils"
 
 inherit cmake pkgconfig lib_package multilib_header
 
@@ -50,6 +50,7 @@  EXTRA_OECMAKE += "-DCMAKE_BUILD_TYPE=MinSizeRel \
                   -DLLVM_TOOL_YAML2OBJ_BUILD=OFF \
                   -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \
                   -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \
+                  -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR} \
                   -DCROSS_TOOLCHAIN_FLAGS_NATIVE='-DCMAKE_TOOLCHAIN_FILE=${WORKDIR}/toolchain-native.cmake' \
                  "