Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[fix][cpp] Fix libcurl build failure when building deb package #17614

Merged
merged 5 commits into from
Sep 13, 2022

Conversation

BewareMyPower
Copy link
Contributor

@BewareMyPower BewareMyPower commented Sep 13, 2022

Motivation

See #17538 (comment)

The root cause is when libcurl is built from source, it uses ld to check if the libcurl.so links to the correct dependencies in runtime. In Linux, a dynamic library links to the paths of /etc/ld.so.conf by default. However, different from other images like centos:7 and alpine, this file includes /usr/lib/x86_64-linux-gnu in debian:9.

$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf

$ cat /etc/ld.so.conf.d/*.conf
/usr/lib/x86_64-linux-gnu/libfakeroot
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

When libcurl is compiled, it links to the install path of libopenssl via the --with-ssl option:

CFLAGS=-fPIC ./configure --with-ssl=/usr/local/ssl/ && \

i.e. /usr/local/ssl/lib/libopenssl.so.

However, after the libcurl.so is built, it links to /usr/lib/x86_64-linux-gnu/libssl.so.1.1, see the following output:

$ ldd /usr/local/lib/libcurl.so
/usr/local/lib/libcurl.so: /usr/lib/x86_64-linux-gnu/libssl.so.1.1: version `OPENSSL_1_1_1' not found (required by /usr/local/lib/libcurl.so)

In debian:9, the default libopenssl version is 1.1.0:

$ strings /usr/lib/x86_64-linux-gnu/libssl.so.1.1 | grep OpenSSL
OpenSSL 1.1.0l  10 Sep 2019

The ABI compatibility is not guaranteed between 1.1.0l and 1.1.1n, see https://abi-laboratory.pro/index.php?view=timeline&l=openssl.

Modifications

Set the LD_LIBRARY_PATH to /usr/local/ssl/lib in the Dockerfile to build deb package.

In Linux, a dynamic library links to the LD_LIBRARY_PATH in prior to /etc/ld.so.conf.
We can see the order in the man page of ld.

  1. For a native linker, the search the contents of the environment variable "LD_LIBRARY_PATH".
    ...
  2. For a native linker on an ELF system, if the file /etc/ld.so.conf exists, the list of directories found in that file.

Actually it's not required for other images like centos:7, but it's also good to add the LD_LIBRARY_PATH to them. So this PR set the environment variable to them as well.

Documentation

  • doc-required
    (Your PR needs to update docs and you will update later)

  • doc-not-needed
    (Please explain why)

  • doc
    (Your PR contains doc changes)

  • doc-complete
    (Docs have been already added)

### Motivation

See apache#17538 (comment)

The root cause is when libcurl is built from source, it uses
[`ld`](https://linux.die.net/man/1/ld) to check if the `libcurl.so`
links to the correct dependencies in runtime. In Linux, a dynamic
library links to the paths of `/etc/ld.so.conf` by default. However,
different from other images like `centos:7` and `alpine`, this file
includes `/usr/lib/x86_64-linux-gnu` in `debian:9`.

```bash
$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf

$ cat /etc/ld.so.conf.d/*.conf
/usr/lib/x86_64-linux-gnu/libfakeroot
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
```

When libcurl is compiled, it links to the install path of libopenssl via
the `--with-ssl` option:

https://github.com/apache/pulsar/blob/1f50366768e76f1a5f7084f7972167f989ddd0af/pulsar-client-cpp/pkg/deb/Dockerfile#L85

i.e. `/usr/local/ssl/lib/libopenssl.so`.

However, after the `libcurl.so` is built, it links to
`/usr/lib/x86_64-linux-gnu/libssl.so.1.1`, see the following output:

```bash
$ ldd /usr/local/lib/libcurl.so
/usr/local/lib/libcurl.so: /usr/lib/x86_64-linux-gnu/libssl.so.1.1: version `OPENSSL_1_1_1' not found (required by /usr/local/lib/libcurl.so)
```

In `debian:9`, the default libopenssl version is 1.1.0:

```bash
$ strings /usr/lib/x86_64-linux-gnu/libssl.so.1.1 | grep OpenSSL
OpenSSL 1.1.0l  10 Sep 2019
```

The ABI compatibility is not guaranteed between 1.1.0l and 1.1.1n, see
https://abi-laboratory.pro/index.php?view=timeline&l=openssl.

### Modifications

Set the `LD_LIBRARY_PATH` to `/usr/local/ssl/lib` in the Dockerfile to
build deb package.

Actually it's not required for other images like `centos:7`, but it's
also good to add the `LD_LIBRARY_PATH` to them. So this PR set the
environment variable to them as well.
@BewareMyPower BewareMyPower added type/bug The PR fixed a bug or issue reported a bug component/client-c++ labels Sep 13, 2022
@BewareMyPower BewareMyPower self-assigned this Sep 13, 2022
Copy link
Member

@lhotari lhotari left a comment

Choose a reason for hiding this comment

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

Thank you. Great explanations too.

@github-actions github-actions bot added the doc-not-needed Your PR changes do not impact docs label Sep 13, 2022
@lhotari
Copy link
Member

lhotari commented Sep 13, 2022

This PR fixes the broken master branch. The GitHub Actions workflow was also broken in a recently merged change (#17571
) so the fix for that issue is also part of this PR.

@lhotari lhotari merged commit 0754ea1 into apache:master Sep 13, 2022
@BewareMyPower BewareMyPower deleted the bewaremypower/fix-cpp-deb-build branch September 13, 2022 14:20
tisonkun pushed a commit to tisonkun/pulsar that referenced this pull request Sep 14, 2022
…e#17614)

* [fix][cpp] Fix libcurl build failure when building deb package

### Motivation

See apache#17538 (comment)

The root cause is when libcurl is built from source, it uses
[`ld`](https://linux.die.net/man/1/ld) to check if the `libcurl.so`
links to the correct dependencies in runtime. In Linux, a dynamic
library links to the paths of `/etc/ld.so.conf` by default. However,
different from other images like `centos:7` and `alpine`, this file
includes `/usr/lib/x86_64-linux-gnu` in `debian:9`.

```bash
$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf

$ cat /etc/ld.so.conf.d/*.conf
/usr/lib/x86_64-linux-gnu/libfakeroot
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
```

When libcurl is compiled, it links to the install path of libopenssl via
the `--with-ssl` option:

https://github.com/apache/pulsar/blob/1f50366768e76f1a5f7084f7972167f989ddd0af/pulsar-client-cpp/pkg/deb/Dockerfile#L85

i.e. `/usr/local/ssl/lib/libopenssl.so`.

However, after the `libcurl.so` is built, it links to
`/usr/lib/x86_64-linux-gnu/libssl.so.1.1`, see the following output:

```bash
$ ldd /usr/local/lib/libcurl.so
/usr/local/lib/libcurl.so: /usr/lib/x86_64-linux-gnu/libssl.so.1.1: version `OPENSSL_1_1_1' not found (required by /usr/local/lib/libcurl.so)
```

In `debian:9`, the default libopenssl version is 1.1.0:

```bash
$ strings /usr/lib/x86_64-linux-gnu/libssl.so.1.1 | grep OpenSSL
OpenSSL 1.1.0l  10 Sep 2019
```

The ABI compatibility is not guaranteed between 1.1.0l and 1.1.1n, see
https://abi-laboratory.pro/index.php?view=timeline&l=openssl.

### Modifications

Set the `LD_LIBRARY_PATH` to `/usr/local/ssl/lib` in the Dockerfile to
build deb package.

Actually it's not required for other images like `centos:7`, but it's
also good to add the `LD_LIBRARY_PATH` to them. So this PR set the
environment variable to them as well.

* Fix workflow so that cpp-tests isn't skipped

* Revisit workflow fix to cover doc only workflows too

* Fix multi-line condition

Co-authored-by: Lari Hotari <[email protected]>
Jason918 pushed a commit that referenced this pull request Sep 17, 2022
* [fix][cpp] Fix libcurl build failure when building deb package

See #17538 (comment)

The root cause is when libcurl is built from source, it uses
[`ld`](https://linux.die.net/man/1/ld) to check if the `libcurl.so`
links to the correct dependencies in runtime. In Linux, a dynamic
library links to the paths of `/etc/ld.so.conf` by default. However,
different from other images like `centos:7` and `alpine`, this file
includes `/usr/lib/x86_64-linux-gnu` in `debian:9`.

```bash
$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf

$ cat /etc/ld.so.conf.d/*.conf
/usr/lib/x86_64-linux-gnu/libfakeroot
/usr/local/lib
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
```

When libcurl is compiled, it links to the install path of libopenssl via
the `--with-ssl` option:

https://github.com/apache/pulsar/blob/1f50366768e76f1a5f7084f7972167f989ddd0af/pulsar-client-cpp/pkg/deb/Dockerfile#L85

i.e. `/usr/local/ssl/lib/libopenssl.so`.

However, after the `libcurl.so` is built, it links to
`/usr/lib/x86_64-linux-gnu/libssl.so.1.1`, see the following output:

```bash
$ ldd /usr/local/lib/libcurl.so
/usr/local/lib/libcurl.so: /usr/lib/x86_64-linux-gnu/libssl.so.1.1: version `OPENSSL_1_1_1' not found (required by /usr/local/lib/libcurl.so)
```

In `debian:9`, the default libopenssl version is 1.1.0:

```bash
$ strings /usr/lib/x86_64-linux-gnu/libssl.so.1.1 | grep OpenSSL
OpenSSL 1.1.0l  10 Sep 2019
```

The ABI compatibility is not guaranteed between 1.1.0l and 1.1.1n, see
https://abi-laboratory.pro/index.php?view=timeline&l=openssl.

Set the `LD_LIBRARY_PATH` to `/usr/local/ssl/lib` in the Dockerfile to
build deb package.

Actually it's not required for other images like `centos:7`, but it's
also good to add the `LD_LIBRARY_PATH` to them. So this PR set the
environment variable to them as well.

* Fix workflow so that cpp-tests isn't skipped

* Revisit workflow fix to cover doc only workflows too

* Fix multi-line condition

Co-authored-by: Lari Hotari <[email protected]>
(cherry picked from commit 0754ea1)
nicoloboschi pushed a commit to datastax/pulsar that referenced this pull request Sep 20, 2022
…e#17614)

* [fix][cpp] Fix libcurl build failure when building deb package

See apache#17538 (comment)

The root cause is when libcurl is built from source, it uses
[`ld`](https://linux.die.net/man/1/ld) to check if the `libcurl.so`
links to the correct dependencies in runtime. In Linux, a dynamic
library links to the paths of `/etc/ld.so.conf` by default. However,
different from other images like `centos:7` and `alpine`, this file
includes `/usr/lib/x86_64-linux-gnu` in `debian:9`.

```bash
$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf

$ cat /etc/ld.so.conf.d/*.conf
/usr/lib/x86_64-linux-gnu/libfakeroot
/usr/local/lib
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
```

When libcurl is compiled, it links to the install path of libopenssl via
the `--with-ssl` option:

https://github.com/apache/pulsar/blob/1f50366768e76f1a5f7084f7972167f989ddd0af/pulsar-client-cpp/pkg/deb/Dockerfile#L85

i.e. `/usr/local/ssl/lib/libopenssl.so`.

However, after the `libcurl.so` is built, it links to
`/usr/lib/x86_64-linux-gnu/libssl.so.1.1`, see the following output:

```bash
$ ldd /usr/local/lib/libcurl.so
/usr/local/lib/libcurl.so: /usr/lib/x86_64-linux-gnu/libssl.so.1.1: version `OPENSSL_1_1_1' not found (required by /usr/local/lib/libcurl.so)
```

In `debian:9`, the default libopenssl version is 1.1.0:

```bash
$ strings /usr/lib/x86_64-linux-gnu/libssl.so.1.1 | grep OpenSSL
OpenSSL 1.1.0l  10 Sep 2019
```

The ABI compatibility is not guaranteed between 1.1.0l and 1.1.1n, see
https://abi-laboratory.pro/index.php?view=timeline&l=openssl.

Set the `LD_LIBRARY_PATH` to `/usr/local/ssl/lib` in the Dockerfile to
build deb package.

Actually it's not required for other images like `centos:7`, but it's
also good to add the `LD_LIBRARY_PATH` to them. So this PR set the
environment variable to them as well.

* Fix workflow so that cpp-tests isn't skipped

* Revisit workflow fix to cover doc only workflows too

* Fix multi-line condition

Co-authored-by: Lari Hotari <[email protected]>
(cherry picked from commit 0754ea1)
(cherry picked from commit 7162c30)
tisonkun added a commit to tisonkun/pulsar that referenced this pull request Oct 4, 2022
This OR logic has been introduced by apache#17614.

I don't know why it's added in the first place - we shouldn't have a OR here. But anyway since pulsar-client-cpp moved out, it should be reasonable to fix the workflow.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cherry-picked/branch-2.10 doc-not-needed Your PR changes do not impact docs release/2.10.2 type/bug The PR fixed a bug or issue reported a bug
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants