diff options
author | L. E. Segovia <amy@centricular.com> | 2024-05-17 01:03:09 +0000 |
---|---|---|
committer | Nirbheek Chauhan <nirbheek@centricular.com> | 2024-05-29 19:36:26 +0530 |
commit | 084c542b66f0420a71c58334ae84d7da5810221d (patch) | |
tree | 991d4d6335816d35d2d5c849a99ed0cd91678135 /config/cross-lin-x86.cbc | |
parent | ffefb822d9412d279cfb0342f827334ee499c95e (diff) |
osxrelocator: Fix dyld being unable to load all our libraries1.24.4
When researching the construction of the monolithic GStreamer
library/framework (see !1466), I found that Qt applications
were totally unable to load GStreamer once deployed through
macdeployqt. In my case, I was consuming the libraries in raw form,
through a tarball I packaged myself, but @thewildtree also ran into
the same issue when testing an app that consumes the official release.
Upon looking at the libraries, I quickly realised that all libraries
had what looked like wrongly nested load commands, of the form
`@rpath/lib/libyadda.dylib`. Although the RPATH entries looked
reasonable at first glance, this is quickly not the case once the
libraries are deployed, because the @rpath of such an app will point to
the root of the Frameworks folder, and macdeployqt deploys the libraries
in raw form there.
However, that's not all the story. @thewildtree's case revealed a much
subtler and deadlier problem: the load commands themselves do not
respect Apple's convention, leading dyld(1) to kill the application on
sight. This is because, although OSXUniversalGenerator tries making the
fat libraries relocatable (correctly) by changing their ID, there's no
equivalent change made to any consumer. All load commands must equal the
ID of the dylib being loaded [1].
This is easily fixed at a given recipe's post-install time by adjusting
the library ID there, and fixing the rpaths so that they always point to
the root of the library path.
[1]: https://developer.apple.com/forums/thread/736728
Part-of: <https://gitlab.freedesktop.org/gstreamer/cerbero/-/merge_requests/1481>
Diffstat (limited to 'config/cross-lin-x86.cbc')
0 files changed, 0 insertions, 0 deletions