On Fri, Jan 31 2020, Michael Forney <[email protected]> wrote:
> 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.
LGTM, ok jca@.
I'll commit it if none of the usual suspects show up soon.
> gcc 10 will enable -fno-common by default, which will put
> zero-initialized data in .bss, causing linking errors when multiple
> definitions are present.
Good to know, thanks.
> ---
> 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;
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE