← Back to issue list

fix(lifecycle): remove usrmerge-breaking symlinks

View original Github issue

Metadata

Project
rockcraft
Number
#498
Type
pull request
State
merged
Author
tigarmo
Labels
Created
Updated
Closed

Current evaluation

Merged. Fixes a Ubuntu 24.04 usrmerge issue where Python venv creation overrides the base lib64 symlink. A post-prime callback now removes the conflicting symlink. Approved by two reviewers and passed CI.

Suggested action:

No scores available.

Issue body

This commit adds code in the post-prime callback to handle the specific combination of "ubuntu@24.04" base + "python" plugin. The handling detects and removes a primed "lib64" symlink to "lib", which can't stay because it breaks the "lib64" symlink to "usr/lib64" on the base layer, making the rock unusable. Read on for more context on *why* this started happening now: The Python plugin works by creating a virtual environment on the part's install dir (which eventually gets primed). By default, the creation of the virtual environment will setup a directory structure like this: ``` <install-dir> |- bin/ |- lib/ |- ... |- lib64 -> lib ``` That is, the creation itself places a "lib64" symlink pointing to "lib". If this gets primed as-is, this symlink will override the base layer's own symlink of "lib64" to "usr/lib64", which renders the rock unusable because all binaries expect the loader to exist in "lib64/ld-linux-x86-64.so.2", when the loader's "true" location is in "usr/lib64/ld-linux-x86-64.so.2". This wasn't an issue prior to 24.04 because of the way we extract stage packages: since the base layer doesn't include the Python interpreter, rockcraft projects need to provision Python themselves, typically via the "python3-venv" stage-package. This causes the inclusion of the package's dependencies, ultimately pulling in "libc6". On Ubuntu versions older than 24.04, the "lib64" package includes the "ld-linux-x86-64.so.2" loader as "/lib64/ld-linux-x86-64.so.2". This means that by the time the virtual environment creation starts the install dir already has a "lib64" directory, which I guess the venv just accepts and leaves alone. The end result is that "lib64" is not a symlink to "lib", and the usrmerge handling code that we already have when packing takes care of packing the files in "lib64" as inside "usr/lib64". The install dir looks like this: ``` <install-dir> |- bin/ |- lib/ |- ... |- lib64/ |- ld-linux-x86-64.so.2 ``` However, 24.04 changed the usrmerge handling and now the libc6 package includes that loader as "/usr/lib64/ld-linux-x86-64.so.2", which means that the "lib64" directory doesn't exist anymore when the venv is created. Thus, "lib64" is created as a symlink to "lib" and breaks the base layer: ``` <install-dir> |- bin/ |- lib/ |- ... |- lib64 -> lib |- usr |- lib64 |- ld-linux-x86-64.so.2 ``` Package listings: Jammy: https://packages.ubuntu.com/jammy/amd64/libc6/filelist Noble: https://packages.ubuntu.com/noble/amd64/libc6/filelist -----

Evaluation history

Date Model Scores Action Summary
qwen/qwen3.6-35b-a3b Merged. Fixes a Ubuntu 24.04 usrmerge issue where Python venv creation overrides the base lib64 symlink. A post-prime callback now removes the conflicting symlink. Approved by two reviewers and passed CI.
qwen3.6-35b-a3b-mtp-q6 Merged a fix stripping a lib64-to-lib symlink from Python venvs. It overrode Ubuntu 24.04's usrmerge layout, breaking rock builds. A post-prime callback now detects and removes the conflicting symlink before packaging.
qwen3.6-35b-a3b-mtp-q6 Merged a fix removing a lib64 symlink during post-prime to prevent breaking usrmerge on Ubuntu 24.04. The Python plugin previously created this symlink, overriding the base layer's lib64 path and breaking rock builds.

Update history

No update history recorded yet.

Related issues

No related issues found above the similarity threshold.