Every source file that includes extern.h will have its own definition
of these variables. Since many compilers allocate the variables with
.comm, they end up getting merged by the linker without error.
However, ISO C requires exactly one definition of objects with
external linkage.

gcc 10 will enable -fno-common by default, which will put
zero-initialized data in .bss, causing linking errors when multiple
definitions are present.
---
 usr.sbin/acme-client/extern.h | 4 ++--
 usr.sbin/acme-client/main.c   | 5 +++--
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/usr.sbin/acme-client/extern.h b/usr.sbin/acme-client/extern.h
index e6b7af0d05b..f280b3e279e 100644
--- a/usr.sbin/acme-client/extern.h
+++ b/usr.sbin/acme-client/extern.h
@@ -277,12 +277,12 @@ char              *json_fmt_signed(const char *, const 
char *, const char *);
 /*
  * Should we print debugging messages?
  */
-int             verbose;
+extern int      verbose;
 
 /*
  * What component is the process within (COMP__MAX for none)?
  */
-enum comp       proccomp;
+extern enum comp proccomp;
 
 __END_DECLS
 
diff --git a/usr.sbin/acme-client/main.c b/usr.sbin/acme-client/main.c
index 7cbeeb7de03..1f59e6c755d 100644
--- a/usr.sbin/acme-client/main.c
+++ b/usr.sbin/acme-client/main.c
@@ -32,6 +32,9 @@
 #define WWW_DIR "/var/www/acme"
 #define CONF_FILE "/etc/acme-client.conf"
 
+int             verbose;
+enum comp       proccomp;
+
 int
 main(int argc, char *argv[])
 {
@@ -46,8 +49,6 @@ main(int argc, char *argv[])
        int               c, rc, revocate = 0;
        int               popts = 0;
        pid_t             pids[COMP__MAX];
-       extern int        verbose;
-       extern enum comp  proccomp;
        size_t            i, altsz, ne;
 
        struct acme_conf        *conf = NULL;
-- 
2.25.0

Reply via email to