diff mbox series

cmake: Fix RPATH for host libraries built by CMake

Message ID ef04ec321632c14eb54ccc7bbd3638d60f602d3e.1520880682.git.jan.kundrat@cesnet.cz
State Accepted
Commit 7d43534625ac06ae01987113e912ffaf1aec2302
Headers show
Series cmake: Fix RPATH for host libraries built by CMake | expand

Commit Message

Jan Kundrát March 12, 2018, 6:41 p.m. UTC
The host shared libraries produced by CMake were missing a proper
DT_RPATH. That became a problem because the DT_RPATH handling is not
transitive by design.

Consider the following scenario:

- pkg-a provides a library (`liba`) which links to `libpcre`
- pkg-b provides a binary (`foo`) and a shared library (`libb`) which is
needed by that binary
- `libb` links to `liba`
- pkg-a and pkg-b are both built by CMake

In this scenario, `foo` is correctly marked with DT_RPATH pointing to
host/lib/, but that path is not used when (recursively) resolving PCRE's
symbols in `liba`. When attempting to run the `foo` binary, the linker
correctly finds both `liba` and `libb`, but it cannot find the
libpcre.so as built by Buildroot for host.

Signed-off-by: Jan Kundrát <jan.kundrat@cesnet.cz>
---
 package/pkg-cmake.mk | 1 +
 1 file changed, 1 insertion(+)

Comments

Samuel Martin March 12, 2018, 8 p.m. UTC | #1
Hi Jan, all,

On Mon, Mar 12, 2018 at 7:41 PM, Jan Kundrát <jan.kundrat@cesnet.cz> wrote:
> The host shared libraries produced by CMake were missing a proper
> DT_RPATH. That became a problem because the DT_RPATH handling is not
> transitive by design.
>
> Consider the following scenario:
>
> - pkg-a provides a library (`liba`) which links to `libpcre`
> - pkg-b provides a binary (`foo`) and a shared library (`libb`) which is
> needed by that binary
> - `libb` links to `liba`
> - pkg-a and pkg-b are both built by CMake
>
> In this scenario, `foo` is correctly marked with DT_RPATH pointing to
> host/lib/, but that path is not used when (recursively) resolving PCRE's
> symbols in `liba`. When attempting to run the `foo` binary, the linker
> correctly finds both `liba` and `libb`, but it cannot find the
> libpcre.so as built by Buildroot for host.
>
> Signed-off-by: Jan Kundrát <jan.kundrat@cesnet.cz>
> ---
>  package/pkg-cmake.mk | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/package/pkg-cmake.mk b/package/pkg-cmake.mk
> index 14ffe4a88f..9b07798a1e 100644
> --- a/package/pkg-cmake.mk
> +++ b/package/pkg-cmake.mk
> @@ -132,6 +132,7 @@ define $(2)_CONFIGURE_CMDS
>                 -DCMAKE_C_FLAGS="$$(HOST_CFLAGS)" \
>                 -DCMAKE_CXX_FLAGS="$$(HOST_CXXFLAGS)" \
>                 -DCMAKE_EXE_LINKER_FLAGS="$$(HOST_LDFLAGS)" \
> +               -DCMAKE_SHARED_LINKER_FLAGS="$$(HOST_LDFLAGS)" \

hmm... I though this was already in Buildroot... I must mix up with
something else :-/

>                 -DCMAKE_ASM_COMPILER="$$(HOSTAS)" \
>                 -DCMAKE_C_COMPILER="$$(CMAKE_HOST_C_COMPILER)" \
>                 -DCMAKE_CXX_COMPILER="$$(CMAKE_HOST_CXX_COMPILER)" \
> --
> 2.16.2
>
>
> _______________________________________________
> buildroot mailing list
> buildroot@busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot

Reviewed-by: Samuel Martin <s.martin49@gmail.com>

Regard,
Peter Korsgaard March 13, 2018, 8:28 a.m. UTC | #2
>>>>> "Jan" == Jan Kundrát <jan.kundrat@cesnet.cz> writes:

 > The host shared libraries produced by CMake were missing a proper
 > DT_RPATH. That became a problem because the DT_RPATH handling is not
 > transitive by design.

 > Consider the following scenario:

 > - pkg-a provides a library (`liba`) which links to `libpcre`
 > - pkg-b provides a binary (`foo`) and a shared library (`libb`) which is
 > needed by that binary
 > - `libb` links to `liba`
 > - pkg-a and pkg-b are both built by CMake

 > In this scenario, `foo` is correctly marked with DT_RPATH pointing to
 > host/lib/, but that path is not used when (recursively) resolving PCRE's
 > symbols in `liba`. When attempting to run the `foo` binary, the linker
 > correctly finds both `liba` and `libb`, but it cannot find the
 > libpcre.so as built by Buildroot for host.

 > Signed-off-by: Jan Kundrát <jan.kundrat@cesnet.cz>

Committed, thanks.
Peter Korsgaard April 6, 2018, 4:51 p.m. UTC | #3
>>>>> "Jan" == Jan Kundrát <jan.kundrat@cesnet.cz> writes:

 > The host shared libraries produced by CMake were missing a proper
 > DT_RPATH. That became a problem because the DT_RPATH handling is not
 > transitive by design.

 > Consider the following scenario:

 > - pkg-a provides a library (`liba`) which links to `libpcre`
 > - pkg-b provides a binary (`foo`) and a shared library (`libb`) which is
 > needed by that binary
 > - `libb` links to `liba`
 > - pkg-a and pkg-b are both built by CMake

 > In this scenario, `foo` is correctly marked with DT_RPATH pointing to
 > host/lib/, but that path is not used when (recursively) resolving PCRE's
 > symbols in `liba`. When attempting to run the `foo` binary, the linker
 > correctly finds both `liba` and `libb`, but it cannot find the
 > libpcre.so as built by Buildroot for host.

 > Signed-off-by: Jan Kundrát <jan.kundrat@cesnet.cz>

Committed to 2018.02.x, thanks.
diff mbox series

Patch

diff --git a/package/pkg-cmake.mk b/package/pkg-cmake.mk
index 14ffe4a88f..9b07798a1e 100644
--- a/package/pkg-cmake.mk
+++ b/package/pkg-cmake.mk
@@ -132,6 +132,7 @@  define $(2)_CONFIGURE_CMDS
 		-DCMAKE_C_FLAGS="$$(HOST_CFLAGS)" \
 		-DCMAKE_CXX_FLAGS="$$(HOST_CXXFLAGS)" \
 		-DCMAKE_EXE_LINKER_FLAGS="$$(HOST_LDFLAGS)" \
+		-DCMAKE_SHARED_LINKER_FLAGS="$$(HOST_LDFLAGS)" \
 		-DCMAKE_ASM_COMPILER="$$(HOSTAS)" \
 		-DCMAKE_C_COMPILER="$$(CMAKE_HOST_C_COMPILER)" \
 		-DCMAKE_CXX_COMPILER="$$(CMAKE_HOST_CXX_COMPILER)" \