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