From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-x234.google.com (mail-lj1-x234.google.com [IPv6:2a00:1450:4864:20::234]) by sourceware.org (Postfix) with ESMTPS id 592CD3858C2C for ; Tue, 4 Jan 2022 20:14:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 592CD3858C2C Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=martin.st Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=martin.st Received: by mail-lj1-x234.google.com with SMTP id g13so50200279ljj.10 for ; Tue, 04 Jan 2022 12:14:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=martin-st.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=puf/97q4eeXKiIDSEg87s9hRqcm4eEZiKHpKYApxs1A=; b=2ORPZ+SuOOJoH+SiVFj6OFo6386smIYnMitNaiziahcFj2Vnf78+TCyi7htOFktkqe 8r6ZD/d2t0JspM+GzMUimzYCKiuiQ4CrfQC6BgLaKXQHVhc52gNGJGfluTyxe4KkDl7V vOPZc7ZlU8U45oEuIzYH9Yh9phswR8Rqmr5sdRTLReMr8HJm0nQ/DpMnxuiq7LgDznwF 8ALA51uFywlaXpojsHKfVZbEtBUpWThSF1A6w7yKlXhWpav3Wgbx28awsO9VWb/Md4Vo JD9tO+ciw8fwcXBY0Zjhvc+FfvDr3I6NaUoBkcNUwNBzOTtu+RJ4ggtY0M5Ilymvsa+q 5BBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=puf/97q4eeXKiIDSEg87s9hRqcm4eEZiKHpKYApxs1A=; b=VHY/yGO6T+qClt9XPU8t6rfl/Nd8mdSlWiMsrzTe5lWJJ6iCukc7+3b036ssozRRea 4zKD2if7rgj+JkUD64CdaRx0o4RI/GxcrnsrLS670KDN1Wago7yw4cE06MI5f4V9mltF JvM4OIPtcI2BTJbbeqZBqpMsMddk6E0nlT00xrhMOmZiT2beoHOkmOtRAmbSp+bh5SgL r/Sy3nOVqnR/PJbCeA6fy9QgfUuRYcCqvi+ACIU6UOV4DYY+lrfWjKh6ZZ20+if1sEJz ZwuTup/3oBQ8LkaVw9Ywzi3tK9rou89mcp/QmwdCtaoEq685I8IR+2/ieVFvIIQXCwWs j25g== X-Gm-Message-State: AOAM531Nqj+SrESSdZgwv0AsaZ8iv8wSMmWr3sMVKNhzW/4NtrzOU19Z EteCm+zV/AAXEr/es0MPYntx/AurjgStBZNP X-Google-Smtp-Source: ABdhPJwmeHst+/177eJ4gIUU7N70FK+PJqhGPKV0srNJnuRwzzWnEt7j8NNtsZoQB01X+Mkw1sZAqQ== X-Received: by 2002:a2e:b616:: with SMTP id r22mr40781602ljn.287.1641327267015; Tue, 04 Jan 2022 12:14:27 -0800 (PST) Received: from localhost.localdomain (dsl-tkubng21-58c01c-243.dhcp.inet.fi. [88.192.28.243]) by smtp.gmail.com with ESMTPSA id c22sm3322838ljd.137.2022.01.04.12.14.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Jan 2022 12:14:26 -0800 (PST) From: =?UTF-8?q?Martin=20Storsj=C3=B6?= To: binutils@sourceware.org Subject: [PATCH] ld: pe-dll: Fix MS link.exe linking against two ld generated import libraries Date: Tue, 4 Jan 2022 22:14:25 +0200 Message-Id: <20220104201426.1006716-1-martin@martin.st> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-13.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, JMQ_SPF_NEUTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Jan 2022 20:14:33 -0000 MS link.exe can successfully link against import libraries generated by ld (via the --out-implib option). However, if linking against more than one such import library at a time, then MS link.exe produces intermixed import tables for those DLL files. MS link.exe seems to sort the individual object files in the import library based on their member names, without taking library boundaries into consideration. E.g. when both libfoo.a and libbar.a contain object files named d000.o, d001.o, d002.o, MS link.exe orders them as libfoo.a(d000.o) libbar.a(d000.o) libfoo.a(d001.o) libbar.a(d001.o) etc. This breaks the implicit assumption that these object files need to be grouped tightly together within one import library. This has not been an issue when MS link.exe links against import libraries produced by dlltool, as the object files there use a pseudorandom prefix (based on the dlltool process ID). Thus this avoids needing to regenerate import libraries with dlltool, if linking a DLL which is going to be linked against by MS link.exe. Signed-off-by: Martin Storsjö --- ld/pe-dll.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/ld/pe-dll.c b/ld/pe-dll.c index 907fafc6208..4e47abd9b24 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -1972,6 +1972,7 @@ static int symptr; static int tmp_seq; static const char *dll_filename; static char *dll_symname; +static int dll_symname_len; #define UNDSEC bfd_und_section_ptr @@ -2082,8 +2083,8 @@ make_head (bfd *parent) char *oname; bfd *abfd; - oname = xmalloc (20); - sprintf (oname, "d%06d.o", tmp_seq); + oname = xmalloc (20 + dll_symname_len); + sprintf (oname, "%s_d%06d.o", dll_symname, tmp_seq); tmp_seq++; abfd = bfd_create (oname, parent); @@ -2171,8 +2172,8 @@ make_tail (bfd *parent) char *oname; bfd *abfd; - oname = xmalloc (20); - sprintf (oname, "d%06d.o", tmp_seq); + oname = xmalloc (20 + dll_symname_len); + sprintf (oname, "%s_d%06d.o", dll_symname, tmp_seq); tmp_seq++; abfd = bfd_create (oname, parent); @@ -2322,8 +2323,8 @@ make_one (def_file_export *exp, bfd *parent, bool include_jmp_stub) } } - oname = xmalloc (20); - sprintf (oname, "d%06d.o", tmp_seq); + oname = xmalloc (20 + dll_symname_len); + sprintf (oname, "%s_d%06d.o", dll_symname, tmp_seq); tmp_seq++; abfd = bfd_create (oname, parent); @@ -2508,8 +2509,8 @@ make_singleton_name_thunk (const char *import, bfd *parent) char *oname; bfd *abfd; - oname = xmalloc (20); - sprintf (oname, "nmth%06d.o", tmp_seq); + oname = xmalloc (20 + dll_symname_len); + sprintf (oname, "%s_nmth%06d.o", dll_symname, tmp_seq); tmp_seq++; abfd = bfd_create (oname, parent); @@ -2584,8 +2585,8 @@ make_import_fixup_entry (const char *name, char *oname; bfd *abfd; - oname = xmalloc (20); - sprintf (oname, "fu%06d.o", tmp_seq); + oname = xmalloc (20 + dll_symname_len); + sprintf (oname, "%s_fu%06d.o", dll_symname, tmp_seq); tmp_seq++; abfd = bfd_create (oname, parent); @@ -2638,8 +2639,8 @@ make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED, bfd *abfd; bfd_size_type size; - oname = xmalloc (20); - sprintf (oname, "rtr%06d.o", tmp_seq); + oname = xmalloc (20 + dll_symname_len); + sprintf (oname, "%s_rtr%06d.o", dll_symname, tmp_seq); tmp_seq++; abfd = bfd_create (oname, parent); @@ -2725,8 +2726,8 @@ pe_create_runtime_relocator_reference (bfd *parent) char *oname; bfd *abfd; - oname = xmalloc (20); - sprintf (oname, "ertr%06d.o", tmp_seq); + oname = xmalloc (20 + dll_symname_len); + sprintf (oname, "%s_ertr%06d.o", dll_symname, tmp_seq); tmp_seq++; abfd = bfd_create (oname, parent); @@ -2833,6 +2834,7 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_ dll_filename = (def->name) ? def->name : dll_name; dll_symname = xstrdup (dll_filename); + dll_symname_len = strlen (dll_symname); for (i = 0; dll_symname[i]; i++) if (!ISALNUM (dll_symname[i])) dll_symname[i] = '_'; @@ -3201,6 +3203,7 @@ pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo) dll_filename = module->name; dll_symname = xstrdup (module->name); + dll_symname_len = strlen (dll_symname); for (j = 0; dll_symname[j]; j++) if (!ISALNUM (dll_symname[j])) dll_symname[j] = '_'; -- 2.25.1