aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Wright <simon@pushface.org>2022-06-12 17:01:22 +0100
committerIain Sandoe <iain@sandoe.co.uk>2022-06-12 23:22:20 +0100
commitadd1adaa17a294ea25918ffb4fdd40f115362632 (patch)
treedcdfb8d3c6d260dbcd54bbd2a6e27f99f8d59079
parent6725f186cb70d48338f69456864bf469a12ee5be (diff)
downloadgcc-add1adaa17a294ea25918ffb4fdd40f115362632.zip
gcc-add1adaa17a294ea25918ffb4fdd40f115362632.tar.gz
gcc-add1adaa17a294ea25918ffb4fdd40f115362632.tar.bz2
Darwin: Truncate kernel-provided version to OS major for Darwin >= 20.
In common with system tools, GCC uses a version obtained from the kernel as the prevailing macOS target, when that is not overridden by command line or environment versions (i.e. mmacosx-version-min=, MACOSX_DEPLOYMENT_TARGET). Presently, GCC assumes that if the OS version is >= 20, the value used should include both major and minium version identifiers. However the system tools (for those versions) truncate the value to the major version - this leads to link errors when combining objects built with clang and GCC for example: ld: warning: object file (null.o) was built for newer macOS version (12.2) than being linked (12.0) The change here truncates the values GCC uses to the major version. gcc/ChangeLog: PR target/104871 * config/darwin-driver.cc (darwin_find_version_from_kernel): If the OS version is darwin20 (macOS 11) or greater, truncate the version to the major number.
-rw-r--r--gcc/config/darwin-driver.cc16
1 files changed, 5 insertions, 11 deletions
diff --git a/gcc/config/darwin-driver.cc b/gcc/config/darwin-driver.cc
index 30e0e64..00287f3 100644
--- a/gcc/config/darwin-driver.cc
+++ b/gcc/config/darwin-driver.cc
@@ -160,19 +160,13 @@ darwin_find_version_from_kernel (void)
goto parse_failed;
/* Darwin20 sees a transition to macOS 11. In this, it seems that the
- mapping to macOS minor version is now shifted to the kernel minor
- version - 1 (at least for the initial releases). */
+ mapping to macOS minor version and patch level is now always 0, 0
+ (at least for macOS 11 and 12). */
if (major_vers >= 20)
{
- int minor_vers = *version_p++ - '0';
- if (ISDIGIT (*version_p))
- minor_vers = minor_vers * 10 + (*version_p++ - '0');
- if (*version_p++ != '.')
- goto parse_failed;
- if (minor_vers > 0)
- minor_vers -= 1; /* Kernel 20.3 => macOS 11.2. */
- /* It's not yet clear whether patch level will be considered. */
- asprintf (&new_flag, "%d.%02d.00", major_vers - 9, minor_vers);
+ /* Apple clang doesn't include the minor version or the patch level
+ in the object file, nor does it pass it to ld */
+ asprintf (&new_flag, "%d.00.00", major_vers - 9);
}
else if (major_vers - 4 <= 4)
/* On 10.4 and earlier, the old linker is used which does not