From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd35.google.com (mail-io1-xd35.google.com [IPv6:2607:f8b0:4864:20::d35]) by sourceware.org (Postfix) with ESMTPS id 6F8403858D28 for ; Wed, 24 Jan 2024 22:51:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6F8403858D28 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 6F8403858D28 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::d35 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706136668; cv=none; b=MrVCwKb6fZ39gXB4MW+3pH89yQmFBN2kGDgnyua/RmAx9zcWr+HqKdRMRqnFVNqy/gQNcFdpjJ/VmWiPhHP6bXvrzGm/vLKOeKh2sLxXNnc8MQA5BtkfHg+0ifi55bMSOwg8gT/aX5FFS9zjE2rBci1UL6gj00uuozBmtBWxNTI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706136668; c=relaxed/simple; bh=hjyGG/dQNgzMeQtTPbmVORWa9g646CXkTAD6ITw7WXk=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=mlB+6mQ/j6vjstRXfpGjmyF50TM1EoJBCe4wx6eWSxNdgOk2GUkxH3y+z/kV18Og5NumNd56tegnDQjD9tKbVcCE+2848l4f+8AFpe9ZMBy+ux4vWOpZ1xmI76XC16oe2s+Y296BJnLUYTVYCIFwynbpzgzkonN6zDWq/3zW+7w= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-io1-xd35.google.com with SMTP id ca18e2360f4ac-7bf2ab2c4caso224230239f.3 for ; Wed, 24 Jan 2024 14:51:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706136665; x=1706741465; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=EeiVHFuZHhIWp62CfYy7JPKhAvQDgw3ABfkoeBOOcbg=; b=hHJUp8SWvMeQ6LKUAMkrMjhwSe/lMdUWWplTwWXTVrOjlo3qA5UgT/O/MIx/AP9Ewf GlldFMVoOZoalo31C/3u89mfVzr3eFno788b5Qlef28btNsN1OoHC9LqMUJpHGE2+pQ5 NgOLNVNT+mV4l/jkqzy8tFtPdhf+QQI9jMuMtWP6HFzSHngOqH02/dD3atg9i7Wu3vTG 0I5Wnn9AEfDPOhOpBcWoFVq+KpwY5eEtBgklqcANjrD1MKTEm6fPavLBafgEZTvBoPUn qJifQaaLc+JOvo0F00oDsxuMBo0a/IGYlbBGWF1p0yLOIPp2+1a9acu92/qsQVao3Su5 uP5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706136665; x=1706741465; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=EeiVHFuZHhIWp62CfYy7JPKhAvQDgw3ABfkoeBOOcbg=; b=DHFgOWzCxf2xql6LUj8LPwrvgyVg66IAex0/1P5FcvPKEyMVfxG0sm1AsCgxlhWSWr 5Soujw36e0Ek45sOWZ4XyPAW02fwWToeINYa85Qo1hVNsD9QISHeytyNg4CDWZgu3mG+ AdHgueJ6+ptESmQkomNgmqJbF27yoeruTmoTTVO5UOXXS7ic2ygxniO1r4JBL44l077Q OC457SMYdAmQNkHXSmsUAnzKJJnJ2ouUtQuA5aJ7D5j2GKFF9FJMrgtAfEfi4260EcIp TopWjgqjhadPCKoUufJqt/UDEOXp8jRXp8Ly8jUx1OElmgL5qykSKsK2iPbHMG3Fzhnm AebA== X-Gm-Message-State: AOJu0YwZ5Hzzr0ebDCY0Qi89af3VlH01nty5T04XnXXmBT07rWrqGy+p LO/0c6On6G1WXT9NCIbfQiaqDgCYFqPQur3bnXyto6N/n/o4Vyu6cHh20gxv X-Google-Smtp-Source: AGHT+IH6Q+q/b8oj9S+k8moVHkuNEY96CDyyKcBa87LrC4JGs7lvKC7BemmcjPKWAz2YSL8Ypl1B4g== X-Received: by 2002:a6b:5903:0:b0:7bf:7ba3:2453 with SMTP id n3-20020a6b5903000000b007bf7ba32453mr193188iob.23.1706136665455; Wed, 24 Jan 2024 14:51:05 -0800 (PST) Received: from gnu-cfl-3.localdomain ([172.56.168.37]) by smtp.gmail.com with ESMTPSA id i192-20020a639dc9000000b005d6323da62esm129508pgd.84.2024.01.24.14.51.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Jan 2024 14:51:05 -0800 (PST) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id BA7467401A3; Wed, 24 Jan 2024 14:51:03 -0800 (PST) From: "H.J. Lu" To: binutils@sourceware.org Cc: nickc@redhat.com Subject: [PATCH] ld: Improve --fatal-warnings for unknown command-line options Date: Wed, 24 Jan 2024 14:51:03 -0800 Message-ID: <20240124225103.219222-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3022.2 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,RCVD_IN_SBL_CSS,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: There are 2 problems with --fatal-warnings for ignored command-line options: 1. --fatal-warnings doesn't trigger an error for an unknown command-line option when --fatal-warnings is the last command-line option. 2. When --fatal-warnings triggers an error for an unknown command-line option, the message says that the unknown command-line option is ignored. This patch queues unknown command-line option warnings and outputs queued command-line option warnings after all command-line options have been processed so that --fatal-warnings can work for unknown command-line options regardless of the order of --fatal-warnings. When --fatal-warnings is used, the linker message is changed from ld: warning: -z bad-option ignored to ld: error: unsupported option: -z bad-option The above also applies to "-z dynamic-undefined-weak" when the known "-z dynamic-undefined-weak" option is ignored. PR ld/31289 * ldelf.c (ldelf_after_parse): Use queue_unknown_cmdline_warning to warn the ignored -z dynamic-undefined-weak option. * ldmain.c (main): Call output_unknown_cmdline_warnings after calling ldemul_after_parse. * ldmisc.c (CMDLINE_WARNING_SIZE): New. (cmdline_warning_list): Likewise. (cmdline_warning_head): Likewise. (cmdline_warning_tail): Likewise. (queue_unknown_cmdline_warning): Likewise. (output_unknown_cmdline_warnings): Likewise. * ldmisc.h (queue_unknown_cmdline_warning): Likewise. (output_unknown_cmdline_warnings): Likewise. * emultempl/elf.em (gld${EMULATION_NAME}_handle_option): Use queue_unknown_cmdline_warning to warn unknown -z option. * testsuite/ld-elf/pr31289-1a.d: New file. * testsuite/ld-elf/pr31289-1b.d: Likewise. * testsuite/ld-elf/pr31289-2a.d: Likewise. * testsuite/ld-elf/pr31289-2b.d: Likewise. * testsuite/ld-elf/pr31289-3a.d: Likewise. * testsuite/ld-elf/pr31289-3b.d: Likewise. * testsuite/ld-elf/pr31289-4a.d: Likewise. * testsuite/ld-elf/pr31289-4b.d: Likewise. --- ld/emultempl/elf.em | 2 +- ld/ldelf.c | 2 +- ld/ldmain.c | 2 + ld/ldmisc.c | 75 ++++++++++++++++++++++++++++++++ ld/ldmisc.h | 2 + ld/testsuite/ld-elf/pr31289-1a.d | 5 +++ ld/testsuite/ld-elf/pr31289-1b.d | 5 +++ ld/testsuite/ld-elf/pr31289-2a.d | 5 +++ ld/testsuite/ld-elf/pr31289-2b.d | 5 +++ ld/testsuite/ld-elf/pr31289-3a.d | 5 +++ ld/testsuite/ld-elf/pr31289-3b.d | 5 +++ ld/testsuite/ld-elf/pr31289-4a.d | 5 +++ ld/testsuite/ld-elf/pr31289-4b.d | 5 +++ 13 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 ld/testsuite/ld-elf/pr31289-1a.d create mode 100644 ld/testsuite/ld-elf/pr31289-1b.d create mode 100644 ld/testsuite/ld-elf/pr31289-2a.d create mode 100644 ld/testsuite/ld-elf/pr31289-2b.d create mode 100644 ld/testsuite/ld-elf/pr31289-3a.d create mode 100644 ld/testsuite/ld-elf/pr31289-3b.d create mode 100644 ld/testsuite/ld-elf/pr31289-4a.d create mode 100644 ld/testsuite/ld-elf/pr31289-4b.d diff --git a/ld/emultempl/elf.em b/ld/emultempl/elf.em index f551225cdac..55a870f7d2d 100644 --- a/ld/emultempl/elf.em +++ b/ld/emultempl/elf.em @@ -873,7 +873,7 @@ fi fragment < 0) - einfo (_("%P: warning: -z dynamic-undefined-weak ignored\n")); + queue_unknown_cmdline_warning ("-z dynamic-undefined-weak"); link_info.dynamic_undefined_weak = 0; } diff --git a/ld/ldmain.c b/ld/ldmain.c index e90c2021b33..3b4ad144a2f 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -479,6 +479,8 @@ main (int argc, char **argv) ldemul_after_parse (); + output_unknown_cmdline_warnings (); + if (config.map_filename) { if (strcmp (config.map_filename, "-") == 0) diff --git a/ld/ldmisc.c b/ld/ldmisc.c index 3c862ea437a..180b24b3448 100644 --- a/ld/ldmisc.c +++ b/ld/ldmisc.c @@ -620,6 +620,81 @@ einfo (const char *fmt, ...) fflush (stderr); } +/* The buffer size for each command-line option warning. */ +#define CMDLINE_WARNING_SIZE 256 + +/* A linked list of command-line option warnings. */ + +struct cmdline_warning_list +{ + struct cmdline_warning_list *next; + char *warning; +}; + +/* The head of the linked list of command-line option warnings. */ +static struct cmdline_warning_list *cmdline_warning_head = NULL; + +/* The tail of the linked list of command-line option warnings. */ +static struct cmdline_warning_list **cmdline_warning_tail + = &cmdline_warning_head; + +/* Queue an unknown command-line option warning. */ + +void +queue_unknown_cmdline_warning (const char *fmt, ...) +{ + va_list arg; + struct cmdline_warning_list *warning_ptr + = xmalloc (sizeof (*warning_ptr)); + warning_ptr->warning = xmalloc (CMDLINE_WARNING_SIZE); + warning_ptr->next = NULL; + int written; + + va_start (arg, fmt); + written = vsnprintf (warning_ptr->warning, CMDLINE_WARNING_SIZE, fmt, + arg); + if (written < 0 || written >= CMDLINE_WARNING_SIZE) + { + /* If vsnprintf fails or truncates, output the warning directly. */ + fflush (stdout); + va_start (arg, fmt); + vfinfo (stderr, fmt, arg, true); + fflush (stderr); + } + else + { + *cmdline_warning_tail = warning_ptr; + cmdline_warning_tail = &warning_ptr->next; + } + va_end (arg); +} + +/* Output queued unknown command-line option warnings. */ + +void +output_unknown_cmdline_warnings (void) +{ + struct cmdline_warning_list *list = cmdline_warning_head; + struct cmdline_warning_list *next; + if (list == NULL) + return; + + fflush (stdout); + + for (; list != NULL; list = next) + { + next = list->next; + if (config.fatal_warnings) + einfo (_("%P: error: unsupported option: %s\n"), list->warning); + else + einfo (_("%P: warning: %s ignored\n"), list->warning); + free (list->warning); + free (list); + } + + fflush (stderr); +} + void info_assert (const char *file, unsigned int line) { diff --git a/ld/ldmisc.h b/ld/ldmisc.h index e8b982fe324..20289127c0a 100644 --- a/ld/ldmisc.h +++ b/ld/ldmisc.h @@ -27,6 +27,8 @@ extern void minfo (const char *, ...); extern void info_msg (const char *, ...); extern void lfinfo (FILE *, const char *, ...); extern void info_assert (const char *, unsigned int); +extern void queue_unknown_cmdline_warning (const char *, ...); +extern void output_unknown_cmdline_warnings (void); #define ASSERT(x) \ do { if (!(x)) info_assert(__FILE__,__LINE__); } while (0) diff --git a/ld/testsuite/ld-elf/pr31289-1a.d b/ld/testsuite/ld-elf/pr31289-1a.d new file mode 100644 index 00000000000..aafbb5feb9a --- /dev/null +++ b/ld/testsuite/ld-elf/pr31289-1a.d @@ -0,0 +1,5 @@ +#source: pr22269.s +#ld: -pie --no-dynamic-linker --fatal-warnings -z dynamic-undefined-weak +#readelf: -r -x .data.rel.ro +#error: unsupported option: -z dynamic-undefined-weak +#target: *-*-linux* *-*-gnu* *-*-nacl* arm*-*-uclinuxfdpiceabi diff --git a/ld/testsuite/ld-elf/pr31289-1b.d b/ld/testsuite/ld-elf/pr31289-1b.d new file mode 100644 index 00000000000..321eac7f2c8 --- /dev/null +++ b/ld/testsuite/ld-elf/pr31289-1b.d @@ -0,0 +1,5 @@ +#source: pr22269.s +#ld: -pie --no-dynamic-linker -z dynamic-undefined-weak --fatal-warnings +#readelf: -r -x .data.rel.ro +#error: unsupported option: -z dynamic-undefined-weak +#target: *-*-linux* *-*-gnu* *-*-nacl* arm*-*-uclinuxfdpiceabi diff --git a/ld/testsuite/ld-elf/pr31289-2a.d b/ld/testsuite/ld-elf/pr31289-2a.d new file mode 100644 index 00000000000..3c8b0fa7e0a --- /dev/null +++ b/ld/testsuite/ld-elf/pr31289-2a.d @@ -0,0 +1,5 @@ +#source: start.s +#ld: -z bad-option1 -z bad-option2 +#warning: -z bad-option1 ignored +#xfail: [is_generic] +# generic linker targets don't support -z options. diff --git a/ld/testsuite/ld-elf/pr31289-2b.d b/ld/testsuite/ld-elf/pr31289-2b.d new file mode 100644 index 00000000000..051dd0b5159 --- /dev/null +++ b/ld/testsuite/ld-elf/pr31289-2b.d @@ -0,0 +1,5 @@ +#source: start.s +#ld: -z bad-option1 -z bad-option2 +#warning: -z bad-option2 ignored +#xfail: [is_generic] +# generic linker targets don't support -z options. diff --git a/ld/testsuite/ld-elf/pr31289-3a.d b/ld/testsuite/ld-elf/pr31289-3a.d new file mode 100644 index 00000000000..70ad22b8413 --- /dev/null +++ b/ld/testsuite/ld-elf/pr31289-3a.d @@ -0,0 +1,5 @@ +#source: start.s +#ld: --fatal-warnings -z bad-option1 -z bad-option2 +#error: unsupported option: -z bad-option1 +#xfail: [is_generic] +# generic linker targets don't support -z options. diff --git a/ld/testsuite/ld-elf/pr31289-3b.d b/ld/testsuite/ld-elf/pr31289-3b.d new file mode 100644 index 00000000000..49ed344bfa8 --- /dev/null +++ b/ld/testsuite/ld-elf/pr31289-3b.d @@ -0,0 +1,5 @@ +#source: start.s +#ld: --fatal-warnings -z bad-option1 -z bad-option2 +#error: unsupported option: -z bad-option2 +#xfail: [is_generic] +# generic linker targets don't support -z options. diff --git a/ld/testsuite/ld-elf/pr31289-4a.d b/ld/testsuite/ld-elf/pr31289-4a.d new file mode 100644 index 00000000000..dd19eed9428 --- /dev/null +++ b/ld/testsuite/ld-elf/pr31289-4a.d @@ -0,0 +1,5 @@ +#source: start.s +#ld: -z bad-option1 -z bad-option2 --fatal-warnings +#error: unsupported option: -z bad-option1 +#xfail: [is_generic] +# generic linker targets don't support -z options. diff --git a/ld/testsuite/ld-elf/pr31289-4b.d b/ld/testsuite/ld-elf/pr31289-4b.d new file mode 100644 index 00000000000..e5708240cc6 --- /dev/null +++ b/ld/testsuite/ld-elf/pr31289-4b.d @@ -0,0 +1,5 @@ +#source: start.s +#ld: -z bad-option1 -z bad-option2 --fatal-warnings +#error: unsupported option: -z bad-option2 +#xfail: [is_generic] +# generic linker targets don't support -z options. -- 2.43.0