GNU Libtool - Patches: patch #9687, bugfix: make -export-dynamic imply...
You are not allowed to post comments on this tracker with your current authentication level.
patch #9687: bugfix: make -export-dynamic imply --whole-archive
Submitter: | David Lamparter <equinox> | ||
Submitted: | Tue 04 Sep 2018 11:56:34 AM UTC | ||
Category: | None | Priority: | 6 |
Status: | Need Info | Privacy: | Public |
Assigned to: | growpotkin | Open/Closed: | Open |
Sat 20 Nov 2021 04:28:29 PM UTC, comment #2: |
David Lamparter <equinox> |
Fri 19 Nov 2021 04:56:43 AM UTC, comment #1: Could you maybe elaborate on your use case? Perhaps there's something that I'm missing.
|
Alex Ameen <growpotkin>![]() ![]() |
Tue 04 Sep 2018 11:56:34 AM UTC, original submission:
libtool: -export-dynamic implies --whole-archive
-Wl,--whole-archive around any archives we link in.
|
David Lamparter <equinox> |
Depends on the following items: None found
Items that depend on this one: None found
There are 0 votes so far. Votes easily highlight which items people would like to see resolved in priority, independently of the priority of the item set by tracker managers.
Follow 3 latest changes.
Date | Changed by | Updated Field | Previous Value | => | Replaced by |
---|---|---|---|---|---|
2021-11-19 | growpotkin | Status | None | ![]() |
Need Info |
Assigned to | None | ![]() |
growpotkin | ||
2018-09-04 | equinox | Attached File | - | ![]() |
Added 0001-libtool-export-dynamic-implies-whole-archive.patch, #44931 |
Well, it's now 3 years later, and my memory of details on this is pretty much gone, but let's try. No warranty on anything here, I'm trying to reconstruct.
comment #1:
Any executable linked with `-export-dynamic` that links static libraries may end up missing globally visible symbols if they are not used by the executable itself. If the program then tries to load a module that needs these symbols, it fails.
`--whole-archive` has no impact on symbol visibility; I don't follow at all what you're trying to say here. A binary linked with `-export-dynamic` is essentially a shared library, and the `ld` docs state:
"This is normally used to turn an archive file into a shared library, forcing every object to be included in the resulting shared library."
I agree `ld` is doing the appropriate thing here, but `libtool` isn't. A binary with `-export-dynamic` needs to export ALL of its global symbols from ALL of its files for dynamically loaded modules to use. It is essentially a shared library at the same time and needs to be treated as such.
NB: `--whole-archive` does NOT make all symbols globally visible! This is about objects, i.e. files. If you have a file getting linked in that has some global symbols, but none of them are used in the binary itself - `ld` will drop the entire file. That's the wrong thing to do for both creating a shared library as well as for creating an executable with `-export-dynamic`.
If I remember correctly, I couldn't find a way to manually add `--whole-archive` to the linker invocation that libtool does, because the option is ordering-sensitive to the file names on the ld command line. I also do not understand what you mean with "variance" between `libtool` and `ld` - there is no equivalency here. `libtool` is a user/wrapper of `ld` that has the express purpose of figuring out the "right" flags for `ld`, and it's failing at its job.
Also: what is that distinct use case for `--whole-archive`? I think it's exactly this situation right here... the ld docs even hint at it.
Barring my memory failing me, I think we tried that and it simply has the same problem.
The patch posted here has been shipped in FRRouting for 3 years now, it has not caused any breakage in any OS/distribution (prominently: Debian, Ubuntu, RHEL, *BSD, …) - as such I would urge you to just merge it and move on. I would happily help you in understanding the issue here, but I can't do that with having more or less lost my own understanding of it. Sorry about that, but there's a boatload of other stuff I need to understand, and my brain is not infinite :(.