On Mon, Mar 04, 2024 at 12:07:15PM +0100, Matthias Klose wrote:
On 04.03.24 11:29, Bastian Blank wrote:
On Mon, Mar 04, 2024 at 08:53:11AM +0100, Matthias Klose wrote:
However the links in /usr/DEB_HOST_GNU_TYPE/include are missing.
Please be a bit more precise, there are no symlinks in this directory.yes, that is the problem. the cross gcc expects these headers in /usr/alpha-linux-gnu/include, not in the header location for the host.
| # dpkg -S /usr/alpha-linux-gnu/include/asm/a.out.h
| linux-libc-dev-alpha-cross: /usr/alpha-linux-gnu/include/asm/a.out.h
| # find /usr/alpha-linux-gnu/include/ -type l
| #
Please show your problem with a log, my crystal ball is broken.
Arguably, a cross toolchain build should probably search /usr/include/<multiarch>. I went back and forth a bit with Matthias
about whether we could add this and did not fully understand his
reasons, but there is one technical reason we want to avoid it for now.
We can have both libc6-dev:TARGET and libc6-dev-TARGET-cross installed
and these packages can have differing versions. When that happens and we search both /usr/<triplet>/include and /usr/include/<multiarch>, we'd
mix two glibc versions with usually bad results (been there).
But this is a search path. If a file exists in one, the second one is
not found. So nothing can happen even from version skew.
The other aspect here is that it is not sufficient to add /usr/include/<multiarch> to the search path as you also need
/usr/include to get a complete linux kernel headers experience. We definitely do not want to add /usr/include, because that is known to misguide configure tests performed for the target architecture.
We are talking about the toolchain itself. What configure tests could
that be? Or is that premature optimization of the gcc build?
You just said that the search path used during the build of the
toolchain and the one for everything else are unrelated. So you are
free to create $BUILD/tmp-include with symlinks for asm, asm-generic,
linux.
The toolchain as installed already finds all headers. So I still don't
see why we need this in the final system.
The problem arises in the reverse sense. If a file does not exist in
one, it is searched in the second and erroneously may be found. That may
make tests pass that should not pass and typically causes a link failure later.
. While I do not have a concrete example at hand, I have seen this pattern repeatedly and generally favour moving stuff out of /usr/include
to avoid this kind of confusion that causes difficult to debug problems.
This also motivates #798955 (in addition to the problem with file
conflicts).
The one case I really do remember quite well is sanitizers. These should
not be enabled in the earlier toolchain stages and failing to disable
them tends to cause linker failures. I don't think it matches the
concrete situation exactly though. You also make a good case in your
followup reporting that gcc-13-cross actually builds.
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 297 |
Nodes: | 16 (2 / 14) |
Uptime: | 12:00:51 |
Calls: | 6,666 |
Files: | 12,214 |
Messages: | 5,336,445 |