Lovely.
> Diff below makes sure libutil doesn't export any unwanted symbols.
> The immediate motivation here is to prevent exportong certain libgcc
> symbols on armv7 that cause issues when switching from gcc to clang.
>
> With this diff, only symbols present in man pages and public header
> files are exported. A few helper functions are made static. The one
> exception is imsg_fd_overhead which according to the relevant commit
> message is intended as a public API. Note that this API isn't
> actually used in our tree. Also note that global variables like this
> are bad API design.
>
> The check_syms script gives the following output:
>
> /usr/lib/libutil.so.12.2 --> obj/libutil.so.13.0
> Dynamic export changes:
> removed:
> __bss_start
> __data_start
> _edata
> _end
> _fini
> _init
> ibuf_dequeue
> ibuf_enqueue
> ibuf_realloc
> imsg_get_fd
>
> ok?
>
>
> Index: lib/libutil/Makefile
> ===================================================================
> RCS file: /cvs/src/lib/libutil/Makefile,v
> retrieving revision 1.39
> diff -u -p -r1.39 Makefile
> --- lib/libutil/Makefile 30 Mar 2016 06:38:43 -0000 1.39
> +++ lib/libutil/Makefile 13 Dec 2017 23:03:05 -0000
> @@ -3,6 +3,8 @@
>
> LIB= util
>
> +VERSION_SCRIPT= ${.CURDIR}/Symbols.map
> +
> HDRS= util.h imsg.h
> SRCS= bcrypt_pbkdf.c check_expire.c duid.c getmaxpartitions.c \
> getrawpartition.c login.c \
> Index: lib/libutil/Symbols.map
> ===================================================================
> RCS file: lib/libutil/Symbols.map
> diff -N lib/libutil/Symbols.map
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ lib/libutil/Symbols.map 13 Dec 2017 23:03:05 -0000
> @@ -0,0 +1,94 @@
> +/*
> + * In order to guarantee that static and shared archs see the same "public"
> + * symbols, this file should always include all the non-static symbols that
> + * are in the application namespace. So, if a symbol starts with a letter,
> + * don't delete it from here without either making it static or renaming it
> + * to have a leading underbar.
> + */
> +
> +{
> + global:
> + bcrypt_pbkdf;
> + fdforkpty;
> + fdopenpty;
> + fmt_scaled;
> + forkpty;
> + fparseln;
> + getmaxpartitions;
> + getptmfd;
> + getrawpartition;
> + ibuf_add;
> + ibuf_close;
> + ibuf_dynamic;
> + ibuf_free;
> + ibuf_left;
> + ibuf_open;
> + ibuf_reserve;
> + ibuf_seek;
> + ibuf_size;
> + ibuf_write;
> + imsg_add;
> + imsg_clear;
> + imsg_close;
> + imsg_compose;
> + imsg_composev;
> + imsg_create;
> + imsg_fd_overhead;
> + imsg_flush;
> + imsg_free;
> + imsg_get;
> + #imsg_get_fd
> + imsg_init;
> + imsg_read;
> + isduid;
> + login;
> + login_check_expire;
> + login_fbtab;
> + login_tty;
> + logout;
> + logwtmp;
> + msgbuf_clear;
> + msgbuf_drain;
> + msgbuf_init;
> + msgbuf_write;
> + ohash_create_entry;
> + ohash_delete;
> + ohash_entries;
> + ohash_find;
> + ohash_first;
> + ohash_init;
> + ohash_insert;
> + ohash_interval;
> + ohash_lookup_interval;
> + ohash_lookup_memory;
> + ohash_next;
> + ohash_qlookup;
> + ohash_qlookupi;
> + ohash_remove;
> + opendev;
> + opendisk;
> + openpty;
> + pidfile;
> + pkcs5_pbkdf2;
> + pw_abort;
> + #pw_cont;
> + pw_copy;
> + pw_edit;
> + pw_error;
> + pw_file;
> + pw_init;
> + pw_lock;
> + pw_mkdb;
> + pw_prompt;
> + pw_scan;
> + pw_setdir;
> + readlabelfs;
> + scan_scaled;
> + uu_lock;
> + uu_lock_txfr;
> + uu_lockerr;
> + uu_unlock;
> +
> + local:
> + *;
> +};
> Index: lib/libutil/imsg-buffer.c
> ===================================================================
> RCS file: /cvs/src/lib/libutil/imsg-buffer.c,v
> retrieving revision 1.10
> diff -u -p -r1.10 imsg-buffer.c
> --- lib/libutil/imsg-buffer.c 11 Apr 2017 09:57:19 -0000 1.10
> +++ lib/libutil/imsg-buffer.c 13 Dec 2017 23:03:05 -0000
> @@ -29,9 +29,9 @@
>
> #include "imsg.h"
>
> -int ibuf_realloc(struct ibuf *, size_t);
> -void ibuf_enqueue(struct msgbuf *, struct ibuf *);
> -void ibuf_dequeue(struct msgbuf *, struct ibuf *);
> +static int ibuf_realloc(struct ibuf *, size_t);
> +static void ibuf_enqueue(struct msgbuf *, struct ibuf *);
> +static void ibuf_dequeue(struct msgbuf *, struct ibuf *);
>
> struct ibuf *
> ibuf_open(size_t len)
> @@ -67,7 +67,7 @@ ibuf_dynamic(size_t len, size_t max)
> return (buf);
> }
>
> -int
> +static int
> ibuf_realloc(struct ibuf *buf, size_t len)
> {
> u_char *b;
> @@ -289,14 +289,14 @@ again:
> return (1);
> }
>
> -void
> +static void
> ibuf_enqueue(struct msgbuf *msgbuf, struct ibuf *buf)
> {
> TAILQ_INSERT_TAIL(&msgbuf->bufs, buf, entry);
> msgbuf->queued++;
> }
>
> -void
> +static void
> ibuf_dequeue(struct msgbuf *msgbuf, struct ibuf *buf)
> {
> TAILQ_REMOVE(&msgbuf->bufs, buf, entry);
> Index: lib/libutil/imsg.c
> ===================================================================
> RCS file: /cvs/src/lib/libutil/imsg.c,v
> retrieving revision 1.15
> diff -u -p -r1.15 imsg.c
> --- lib/libutil/imsg.c 11 Apr 2017 09:57:19 -0000 1.15
> +++ lib/libutil/imsg.c 13 Dec 2017 23:03:05 -0000
> @@ -30,7 +30,7 @@
>
> int imsg_fd_overhead = 0;
>
> -int imsg_get_fd(struct imsgbuf *);
> +static int imsg_get_fd(struct imsgbuf *);
>
> void
> imsg_init(struct imsgbuf *ibuf, int fd)
> @@ -266,7 +266,7 @@ imsg_free(struct imsg *imsg)
> freezero(imsg->data, imsg->hdr.len - IMSG_HEADER_SIZE);
> }
>
> -int
> +static int
> imsg_get_fd(struct imsgbuf *ibuf)
> {
> int fd;
> Index: lib/libutil/shlib_version
> ===================================================================
> RCS file: /cvs/src/lib/libutil/shlib_version,v
> retrieving revision 1.28
> diff -u -p -r1.28 shlib_version
> --- lib/libutil/shlib_version 20 Apr 2017 17:48:30 -0000 1.28
> +++ lib/libutil/shlib_version 13 Dec 2017 23:03:05 -0000
> @@ -1,2 +1,2 @@
> -major=12
> -minor=2
> +major=13
> +minor=0
>