summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Groffen <grobian@gentoo.org>2023-09-26 21:30:33 +0200
committerFabian Groffen <grobian@gentoo.org>2023-09-26 21:35:52 +0200
commit753907f35f78864cf66a7bc084b32eb56b31684d (patch)
tree0df84c8bf39b0e255f04f3fcaaf54993c2e64399 /sys-devel
parentscripts/bootstrap-prefix: fix RAP stage3 on python due to init.d script (diff)
downloadprefix-753907f35f78864cf66a7bc084b32eb56b31684d.tar.gz
prefix-753907f35f78864cf66a7bc084b32eb56b31684d.tar.bz2
prefix-753907f35f78864cf66a7bc084b32eb56b31684d.zip
sys-apps/binutils-config: fix ldwrapper for CLT 15
Because -platform_version is actually supported since a while, and we don't really support older versions (except Darwin 17 and 9 which use way different versions), just switch to using platform_version when the target is macos 12 or up. Closes: https://bugs.gentoo.org/910277 Signed-off-by: Fabian Groffen <grobian@gentoo.org>
Diffstat (limited to 'sys-devel')
-rw-r--r--sys-devel/binutils-config/files/ldwrapper.c60
1 files changed, 50 insertions, 10 deletions
diff --git a/sys-devel/binutils-config/files/ldwrapper.c b/sys-devel/binutils-config/files/ldwrapper.c
index 1b5fa19ad3..16932af5d6 100644
--- a/sys-devel/binutils-config/files/ldwrapper.c
+++ b/sys-devel/binutils-config/files/ldwrapper.c
@@ -207,6 +207,7 @@ main(int argc, char *argv[])
char *ld = ldbuf;
char ctarget[128];
char *darwin_dt = getenv("MACOSX_DEPLOYMENT_TARGET");
+ int darwin_dt_ver = 0;
char is_cross = 0;
char is_darwin = 0;
char darwin_use_rpath = 1;
@@ -293,8 +294,12 @@ main(int argc, char *argv[])
newargc++;
if (argv[i][1] == 'v' || argv[i][1] == 'V')
verbose = 1;
- if (strcmp(argv[i], "-macosx_version_min") == 0 && i < argc - 1)
+ if ((strcmp(argv[i], "-macosx_version_min") == 0 ||
+ strcmp(argv[i], "-macos_version_min") == 0) && i < argc - 1)
darwin_dt = argv[i + 1];
+ if (strcmp(argv[i], "-platform_version") == 0 &&
+ i < argc - 3 && strcmp(argv[i + 1], "macos") == 0)
+ darwin_dt = argv[i + 2];
/* ld64 will refuse to accept -rpath if any of the
* following options are given */
if (strcmp(argv[i], "-static") == 0 ||
@@ -306,6 +311,12 @@ main(int argc, char *argv[])
}
}
+ if (is_darwin && darwin_dt != NULL) {
+ darwin_dt_ver = (int)strtol(darwin_dt, &p, 10) * 100;
+ if (*p == '.')
+ darwin_dt_ver += (int)strtol(p + 1, &p, 10);
+ }
+
/* Note: Code below assumes that newargc is the count of -L arguments. */
/* If a package being cross-compiled injects standard directories, it's
@@ -325,10 +336,7 @@ main(int argc, char *argv[])
* parsing at dots. darwin_dt != NULL isn't
* just for safety: ld64 also refuses -rpath
* when not given a deployment target at all */
- darwin_use_rpath = darwin_dt != NULL &&
- (atoi(darwin_dt) > 10 ||
- (strncmp(darwin_dt, "10.", 3) == 0 &&
- atoi(darwin_dt + 3) >= 5));
+ darwin_use_rpath = darwin_dt_ver >= 1005;
}
if (darwin_use_rpath) {
@@ -345,8 +353,8 @@ main(int argc, char *argv[])
newargc += 2 + 1;
#ifdef DARWIN_LD_SYSLIBROOT
- /* add -syslibroot <path> -sdk_version <ver> */
- newargc += 4;
+ /* add -syslibroot <path> -platform_version macos <ver> 0.0 */
+ newargc += 6;
#endif
} else {
/* add the 4 paths we want (-L + -R) */
@@ -393,8 +401,17 @@ main(int argc, char *argv[])
* version here, for the sdk link can be versionless when set to
* CommandLineTools */
#ifdef DARWIN_LD_SYSLIBROOT
- newargv[j++] = "-sdk_version";
- newargv[j++] = darwin_dt;
+ /* bug #910277: transform into platform_version arg for newer
+ * targets */
+ if (darwin_dt_ver >= 1200) {
+ newargv[j++] = "-platform_version";
+ newargv[j++] = "macos";
+ newargv[j++] = darwin_dt;
+ newargv[j++] = "0.0";
+ } else {
+ newargv[j++] = "-sdk_version";
+ newargv[j++] = darwin_dt;
+ }
newargv[j++] = "-syslibroot";
newargv[j++] = EPREFIX "/MacOSX.sdk";
#endif
@@ -405,6 +422,26 @@ main(int argc, char *argv[])
/* position k right after the original arguments */
k = j - 1 + argc;
for (i = 1; i < argc; i++, j++) {
+#ifdef DARWIN_LD_SYSLIBROOT
+ if (is_darwin) {
+ /* skip platform version stuff, we already pushed it out */
+ if ((strcmp(argv[i], "-macosx_version_min") == 0 ||
+ strcmp(argv[i], "-macos_version_min") == 0) && i < argc - 1)
+ {
+ i++;
+ j--;
+ continue;
+ }
+ if (strcmp(argv[i], "-platform_version") == 0 &&
+ i < argc - 3 && strcmp(argv[i + 1], "macos") == 0)
+ {
+ i += 3;
+ j--;
+ continue;
+ }
+ }
+#endif
+
newargv[j] = argv[i];
if (is_cross || (is_darwin && !darwin_use_rpath))
@@ -487,7 +524,10 @@ main(int argc, char *argv[])
if (verbose) {
fprintf(stderr, "%s: invoking %s with arguments:\n", wrapper, ld);
for (j = 0; newargv[j] != NULL; j++)
- fprintf(stderr, " %s\n", newargv[j]);
+ fprintf(stderr, " %s%s",
+ newargv[j],
+ newargv[j + 1] != NULL && newargv[j + 1][0] != '-'
+ ? "" : "\n");
}
/* finally, execute the real ld */