Skip to content

GH-128469: set RPATH on the builddir Python executable #128470

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

Closed
wants to merge 1 commit into from

Conversation

FFY00
Copy link
Member

@FFY00 FFY00 commented Jan 4, 2025

Signed-off-by: Filipe Laíns <lains@riseup.net

# Build the interpreter binary to install
.PHONY: python-bin
python-bin: Programs/python.o $(LINK_PYTHON_DEPS) pybuilddir.txt
Copy link
Contributor

@eli-schwartz eli-schwartz Jan 8, 2025

Choose a reason for hiding this comment

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

Allowing the software to be runnable from the build directory is an overall great idea. There's two common ways to do it:

  • build / link it twice. Once with an rpath for running uninstalled, once without an rpath for installing.
  • rewrite the binary at install time to remove the unsafe path

This PR implements the former approach, which has the advantage of being simple to implement. The downside is a lack of "purity" -- you don't run tests with what you install, but rather with something you reasonably hope is effectively the same. It also requires relinking, which can be slow if using LTO.

I'm a fan of the latter approach. It's a pity that there's no standard tooling for it. chrpath/patchelf can be used I guess but may not be installed, plus you can end up with slightly odd ELF header reordering that has had occasional very bad bugs (patchelf does a lot of sorcery that chrpath doesn't, and in general extending an rpath rather than truncating it can be risky).

Meson has a pure python, stdlib-only implementation of an ELF rpath rewriter which uses simple truncation, which might help: https://github.com/mesonbuild/meson/blob/master/mesonbuild/scripts/depfixer.py

Copy link
Member

Choose a reason for hiding this comment

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

It's not clear to me what problem this issue / PR is trying to solve that isn't addressed by the existing RUNSHARED configuration variable. Can you elaborate?

In any case, doing two links just to address the apparent edge case of simplifying running from the build directory without installing seems overkill and counter to the goal of reproducible builds.

Copy link
Member Author

Choose a reason for hiding this comment

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

It's not clear to me what problem this issue / PR is trying to solve that isn't addressed by the existing RUNSHARED configuration variable. Can you elaborate?

Running python directly from the build directory, which is a big part of the development process.

In any case, doing two links just to address the apparent edge case of simplifying running from the build directory without installing seems overkill and counter to the goal of reproducible builds.

Yeah, I understand. With GH-127972 merged it becomes simple to show a warning in getpath if the library is loaded from the system instead of the build directory, so I am gonna go for that approach instead.

@FFY00 FFY00 closed this Jan 8, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants