All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH] package/llvm: remove $ORIGIN/../lib from RPATH
@ 2018-04-11 15:30 Valentin Korenblit
  2018-04-11 15:49 ` Thomas Petazzoni
  2018-04-11 16:48 ` Romain Naour
  0 siblings, 2 replies; 4+ messages in thread
From: Valentin Korenblit @ 2018-04-11 15:30 UTC (permalink / raw)
  To: buildroot

AddLLVM.cmake adds $ORIGIN/../lib to the RPATH of llvm binaries.
This causes a problem when llvm-config from host installed in
STAGING_DIR is executed under the following conditions:

*Target architecture same as host architecture (normally x86_64)
*Target's libc different from host's libc (normally glibc)

llvm-config will try to link with the target's libc, resulting in:

./llvm-config: error while loading shared libraries: libc.so.0:
cannot open shared object file: No such file or directory.

Link to autobuild error:
http://autobuild.buildroot.net/results/b81c12d529c66a028e2297ea5ce1d6930324fa69/

To avoid this, remove the code from llvm_setup_rpath in AddLLVM.cmake

Link to discussion:
http://lists.busybox.net/pipermail/buildroot/2018-April/218627.html

Signed-off-by: Valentin Korenblit <valentin.korenblit@smile.fr>
---
 .../llvm/0001-Avoid-adding-RPATH-to-binaries.patch | 55 ++++++++++++++++++++++
 1 file changed, 55 insertions(+)
 create mode 100644 package/llvm/0001-Avoid-adding-RPATH-to-binaries.patch

diff --git a/package/llvm/0001-Avoid-adding-RPATH-to-binaries.patch b/package/llvm/0001-Avoid-adding-RPATH-to-binaries.patch
new file mode 100644
index 0000000000..861eed1f1e
--- /dev/null
+++ b/package/llvm/0001-Avoid-adding-RPATH-to-binaries.patch
@@ -0,0 +1,55 @@
+From 134fe34a0b737003a9728f77d37fd3a6d763f757 Mon Sep 17 00:00:00 2001
+From: Valentin Korenblit <valentin.korenblit@smile.fr>
+Date: Wed, 11 Apr 2018 16:26:10 +0200
+Subject: [PATCH] Avoid adding RPATH to binaries
+
+Signed-off-by: Valentin Korenblit <valentin.korenblit@smile.fr>
+---
+ cmake/modules/AddLLVM.cmake | 30 ------------------------------
+ 1 file changed, 30 deletions(-)
+
+diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake
+index 1c922651b13..e70c9fbdb8e 100644
+--- a/cmake/modules/AddLLVM.cmake
++++ b/cmake/modules/AddLLVM.cmake
+@@ -1440,37 +1440,7 @@ function(llvm_externalize_debuginfo name)
+ endfunction()
+ 
+ function(llvm_setup_rpath name)
+-  if(CMAKE_INSTALL_RPATH)
+-    return()
+-  endif()
+-
+-  if(LLVM_INSTALL_PREFIX AND NOT (LLVM_INSTALL_PREFIX STREQUAL CMAKE_INSTALL_PREFIX))
+-    set(extra_libdir ${LLVM_LIBRARY_DIR})
+-  elseif(LLVM_BUILD_LIBRARY_DIR)
+-    set(extra_libdir ${LLVM_LIBRARY_DIR})
+-  endif()
+-
+-  if (APPLE)
+-    set(_install_name_dir INSTALL_NAME_DIR "@rpath")
+-    set(_install_rpath "@loader_path/../lib" ${extra_libdir})
+-  elseif(UNIX)
+-    set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
+-    if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
+-      set_property(TARGET ${name} APPEND_STRING PROPERTY
+-                   LINK_FLAGS " -Wl,-z,origin ")
+-    elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND NOT LLVM_LINKER_IS_GOLD)
+-      # $ORIGIN is not interpreted at link time by ld.bfd
+-      set_property(TARGET ${name} APPEND_STRING PROPERTY
+-                   LINK_FLAGS " -Wl,-rpath-link,${LLVM_LIBRARY_OUTPUT_INTDIR} ")
+-    endif()
+-  else()
+-    return()
+-  endif()
+ 
+-  set_target_properties(${name} PROPERTIES
+-                        BUILD_WITH_INSTALL_RPATH On
+-                        INSTALL_RPATH "${_install_rpath}"
+-                        ${_install_name_dir})
+ endfunction()
+ 
+ function(setup_dependency_debugging name)
+-- 
+2.14.3
+
-- 
2.14.3

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [Buildroot] [PATCH] package/llvm: remove $ORIGIN/../lib from RPATH
  2018-04-11 15:30 [Buildroot] [PATCH] package/llvm: remove $ORIGIN/../lib from RPATH Valentin Korenblit
@ 2018-04-11 15:49 ` Thomas Petazzoni
  2018-04-11 16:12   ` Valentin Korenblit
  2018-04-11 16:48 ` Romain Naour
  1 sibling, 1 reply; 4+ messages in thread
From: Thomas Petazzoni @ 2018-04-11 15:49 UTC (permalink / raw)
  To: buildroot

Hello Valentin,

On Wed, 11 Apr 2018 17:30:22 +0200, Valentin Korenblit wrote:
> AddLLVM.cmake adds $ORIGIN/../lib to the RPATH of llvm binaries.
> This causes a problem when llvm-config from host installed in
> STAGING_DIR is executed under the following conditions:
> 
> *Target architecture same as host architecture (normally x86_64)
> *Target's libc different from host's libc (normally glibc)
> 
> llvm-config will try to link with the target's libc, resulting in:
> 
> ./llvm-config: error while loading shared libraries: libc.so.0:
> cannot open shared object file: No such file or directory.
> 
> Link to autobuild error:
> http://autobuild.buildroot.net/results/b81c12d529c66a028e2297ea5ce1d6930324fa69/
> 
> To avoid this, remove the code from llvm_setup_rpath in AddLLVM.cmake
> 
> Link to discussion:
> http://lists.busybox.net/pipermail/buildroot/2018-April/218627.html
> 
> Signed-off-by: Valentin Korenblit <valentin.korenblit@smile.fr>

Thanks for this work. However, while this is going to work for the
Buildroot build (thanks to the hardcoded absolute RPATH encoded into
the binaries), I believe it will fail once "make sdk" is executed,
because "make sdk" will change the RPATH of binaries in STAGING_DIR to
be relative RPATHs.

Could you try after applying your patch:

$ make [.... do the normal build ...]
$ ./output/staging/usr/bin/llvm-config --the-flags-that-are-important
$ readelf -d output/staging/usr/bin/llvm-config
$ make sdk
$ ./output/staging/usr/bin/llvm-config --the-flags-that-are-important
$ readelf -d output/staging/usr/bin/llvm-config

Is there any difference before/after the "make sdk" ?

Best regards,

Thomas
-- 
Thomas Petazzoni, CTO, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Buildroot] [PATCH] package/llvm: remove $ORIGIN/../lib from RPATH
  2018-04-11 15:49 ` Thomas Petazzoni
@ 2018-04-11 16:12   ` Valentin Korenblit
  0 siblings, 0 replies; 4+ messages in thread
From: Valentin Korenblit @ 2018-04-11 16:12 UTC (permalink / raw)
  To: buildroot

Hello Thomas,

On 11/04/2018 17:49, Thomas Petazzoni wrote:
> Hello Valentin,
>
> On Wed, 11 Apr 2018 17:30:22 +0200, Valentin Korenblit wrote:
>> AddLLVM.cmake adds $ORIGIN/../lib to the RPATH of llvm binaries.
>> This causes a problem when llvm-config from host installed in
>> STAGING_DIR is executed under the following conditions:
>>
>> *Target architecture same as host architecture (normally x86_64)
>> *Target's libc different from host's libc (normally glibc)
>>
>> llvm-config will try to link with the target's libc, resulting in:
>>
>> ./llvm-config: error while loading shared libraries: libc.so.0:
>> cannot open shared object file: No such file or directory.
>>
>> Link to autobuild error:
>> http://autobuild.buildroot.net/results/b81c12d529c66a028e2297ea5ce1d6930324fa69/
>>
>> To avoid this, remove the code from llvm_setup_rpath in AddLLVM.cmake
>>
>> Link to discussion:
>> http://lists.busybox.net/pipermail/buildroot/2018-April/218627.html
>>
>> Signed-off-by: Valentin Korenblit <valentin.korenblit@smile.fr>
> Thanks for this work. However, while this is going to work for the
> Buildroot build (thanks to the hardcoded absolute RPATH encoded into
> the binaries), I believe it will fail once "make sdk" is executed,
> because "make sdk" will change the RPATH of binaries in STAGING_DIR to
> be relative RPATHs.
>
> Could you try after applying your patch:
>
> $ make [.... do the normal build ...]
> $ ./output/staging/usr/bin/llvm-config --the-flags-that-are-important
> $ readelf -d output/staging/usr/bin/llvm-config
> $ make sdk
> $ ./output/staging/usr/bin/llvm-config --the-flags-that-are-important
> $ readelf -d output/staging/usr/bin/llvm-config
>
> Is there any difference before/after the "make sdk" ?

Before running make sdk:

(RPATH) Library rpath: [/home/vakor/buildroot/test/x86/host/lib]

After running make sdk:

(RUNPATH) Library runpath: []

llvm-config works correctly in both cases. I tarballed host, moved
it to a different location, extracted it and run relocate-sdk.sh.

>
> Best regards,
>
> Thomas

Best regards,

Valentin

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Buildroot] [PATCH] package/llvm: remove $ORIGIN/../lib from RPATH
  2018-04-11 15:30 [Buildroot] [PATCH] package/llvm: remove $ORIGIN/../lib from RPATH Valentin Korenblit
  2018-04-11 15:49 ` Thomas Petazzoni
@ 2018-04-11 16:48 ` Romain Naour
  1 sibling, 0 replies; 4+ messages in thread
From: Romain Naour @ 2018-04-11 16:48 UTC (permalink / raw)
  To: buildroot

Hi Thomas, Valentin,

Le 11/04/2018 ? 17:30, Valentin Korenblit a ?crit?:
> AddLLVM.cmake adds $ORIGIN/../lib to the RPATH of llvm binaries.
> This causes a problem when llvm-config from host installed in
> STAGING_DIR is executed under the following conditions:
> 
> *Target architecture same as host architecture (normally x86_64)
> *Target's libc different from host's libc (normally glibc)
> 
> llvm-config will try to link with the target's libc, resulting in:
> 
> ./llvm-config: error while loading shared libraries: libc.so.0:
> cannot open shared object file: No such file or directory.
> 
> Link to autobuild error:
> http://autobuild.buildroot.net/results/b81c12d529c66a028e2297ea5ce1d6930324fa69/
> 
> To avoid this, remove the code from llvm_setup_rpath in AddLLVM.cmake
> 
> Link to discussion:
> http://lists.busybox.net/pipermail/buildroot/2018-April/218627.html
> 
> Signed-off-by: Valentin Korenblit <valentin.korenblit@smile.fr>
> ---

[...]

> +diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake
> +index 1c922651b13..e70c9fbdb8e 100644
> +--- a/cmake/modules/AddLLVM.cmake
> ++++ b/cmake/modules/AddLLVM.cmake
> +@@ -1440,37 +1440,7 @@ function(llvm_externalize_debuginfo name)
> + endfunction()
> + 
> + function(llvm_setup_rpath name)
> +-  if(CMAKE_INSTALL_RPATH)
> +-    return()
> +-  endif()

If CMAKE_INSTALL_PATH is defined on the cmake command line, this function just
return :)

So, you have to add HOST_LLVM_CONF_OPTS +=
-DCMAKE_INSTALL_RPATH="$(HOST_DIR)/lib" and drop this patch.

$ readelf -d
/home/romnao/buildroot/test/llvm/host/x86_64-buildroot-linux-uclibc/sysroot/usr/bin/llvm-config

(RPATH)              Biblioth?que rpath: [/home/romnao/buildroot/test/llvm/host/lib]

Thoughts ?

Best regards,
Romain

> +-
> +-  if(LLVM_INSTALL_PREFIX AND NOT (LLVM_INSTALL_PREFIX STREQUAL CMAKE_INSTALL_PREFIX))
> +-    set(extra_libdir ${LLVM_LIBRARY_DIR})
> +-  elseif(LLVM_BUILD_LIBRARY_DIR)
> +-    set(extra_libdir ${LLVM_LIBRARY_DIR})
> +-  endif()
> +-
> +-  if (APPLE)
> +-    set(_install_name_dir INSTALL_NAME_DIR "@rpath")
> +-    set(_install_rpath "@loader_path/../lib" ${extra_libdir})
> +-  elseif(UNIX)
> +-    set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
> +-    if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
> +-      set_property(TARGET ${name} APPEND_STRING PROPERTY
> +-                   LINK_FLAGS " -Wl,-z,origin ")
> +-    elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND NOT LLVM_LINKER_IS_GOLD)
> +-      # $ORIGIN is not interpreted at link time by ld.bfd
> +-      set_property(TARGET ${name} APPEND_STRING PROPERTY
> +-                   LINK_FLAGS " -Wl,-rpath-link,${LLVM_LIBRARY_OUTPUT_INTDIR} ")
> +-    endif()
> +-  else()
> +-    return()
> +-  endif()
> + 
> +-  set_target_properties(${name} PROPERTIES
> +-                        BUILD_WITH_INSTALL_RPATH On
> +-                        INSTALL_RPATH "${_install_rpath}"
> +-                        ${_install_name_dir})
> + endfunction()
> + 
> + function(setup_dependency_debugging name)
> +-- 
> +2.14.3
> +
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-04-11 16:48 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-11 15:30 [Buildroot] [PATCH] package/llvm: remove $ORIGIN/../lib from RPATH Valentin Korenblit
2018-04-11 15:49 ` Thomas Petazzoni
2018-04-11 16:12   ` Valentin Korenblit
2018-04-11 16:48 ` Romain Naour

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.