diff --git a/package/busybox/0003-libbb-reduce-the-overhead-of-single-parameter-bb_err.patch b/package/busybox/0003-libbb-reduce-the-overhead-of-single-parameter-bb_err.patch
new file mode 100644
index 0000000000..0b2a9beb84
--- /dev/null
+++ b/package/busybox/0003-libbb-reduce-the-overhead-of-single-parameter-bb_err.patch
@@ -0,0 +1,7635 @@
+From 6937487be73cd4563b876413277a295a5fe2f32c Mon Sep 17 00:00:00 2001
+From: James Byrne <james.byrne@origamienergy.com>
+Date: Tue, 2 Jul 2019 11:35:03 +0200
+Subject: [PATCH] libbb: reduce the overhead of single parameter bb_error_msg()
+ calls
+
+Back in 2007, commit 0c97c9d43707 ("'simple' error message functions by
+Loic Grenie") introduced bb_simple_perror_msg() to allow for a lower
+overhead call to bb_perror_msg() when only a string was being printed
+with no parameters. This saves space for some CPU architectures because
+it avoids the overhead of a call to a variadic function. However there
+has never been a simple version of bb_error_msg(), and since 2007 many
+new calls to bb_perror_msg() have been added that only take a single
+parameter and so could have been using bb_simple_perror_message().
+
+This changeset introduces 'simple' versions of bb_info_msg(),
+bb_error_msg(), bb_error_msg_and_die(), bb_herror_msg() and
+bb_herror_msg_and_die(), and replaces all calls that only take a
+single parameter, or use something like ("%s", arg), with calls to the
+corresponding 'simple' version.
+
+Since it is likely that single parameter calls to the variadic functions
+may be accidentally reintroduced in the future a new debugging config
+option WARN_SIMPLE_MSG has been introduced. This uses some macro magic
+which will cause any such calls to generate a warning, but this is
+turned off by default to avoid use of the unpleasant macros in normal
+circumstances.
+
+This is a large changeset due to the number of calls that have been
+replaced. The only files that contain changes other than simple
+substitution of function calls are libbb.h, libbb/herror_msg.c,
+libbb/verror_msg.c and libbb/xfuncs_printf.c. In miscutils/devfsd.c,
+networking/udhcp/common.h and util-linux/mdev.c additonal macros have
+been added for logging so that single parameter and multiple parameter
+logging variants exist.
+
+The amount of space saved varies considerably by architecture, and was
+found to be as follows (for 'defconfig' using GCC 7.4):
+
+Arm:     -92 bytes
+MIPS:    -52 bytes
+PPC:   -1836 bytes
+x86_64: -938 bytes
+
+Note that for the MIPS architecture only an exception had to be made
+disabling the 'simple' calls for 'udhcp' (in networking/udhcp/common.h)
+because it made these files larger on MIPS.
+
+Signed-off-by: James Byrne <james.byrne@origamienergy.com>
+Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
+---
+ Config.in                                   | 13 ++++++
+ archival/bbunzip.c                          |  2 +-
+ archival/bzip2.c                            |  4 +-
+ archival/dpkg.c                             | 14 +++---
+ archival/gzip.c                             |  4 +-
+ archival/libarchive/data_extract_all.c      |  4 +-
+ archival/libarchive/decompress_bunzip2.c    |  2 +-
+ archival/libarchive/decompress_gunzip.c     | 14 +++---
+ archival/libarchive/decompress_uncompress.c | 10 ++---
+ archival/libarchive/decompress_unlzma.c     |  6 +--
+ archival/libarchive/decompress_unxz.c       |  4 +-
+ archival/libarchive/get_header_ar.c         |  8 ++--
+ archival/libarchive/get_header_cpio.c       |  6 +--
+ archival/libarchive/get_header_tar.c        | 14 +++---
+ archival/libarchive/open_transformer.c      |  6 +--
+ archival/libarchive/seek_by_jump.c          |  2 +-
+ archival/libarchive/unpack_ar_archive.c     |  2 +-
+ archival/lzop.c                             | 14 +++---
+ archival/rpm.c                              |  2 +-
+ archival/tar.c                              | 10 ++---
+ archival/unzip.c                            | 18 ++++----
+ console-tools/loadfont.c                    | 20 ++++-----
+ console-tools/loadkmap.c                    |  2 +-
+ console-tools/openvt.c                      |  4 +-
+ console-tools/showkey.c                     |  2 +-
+ coreutils/cp.c                              |  4 +-
+ coreutils/cut.c                             |  6 +--
+ coreutils/date.c                            |  2 +-
+ coreutils/df.c                              |  2 +-
+ coreutils/echo.c                            |  2 +-
+ coreutils/env.c                             |  2 +-
+ coreutils/expand.c                          |  2 +-
+ coreutils/expr.c                            | 16 +++----
+ coreutils/id.c                              |  2 +-
+ coreutils/install.c                         |  2 +-
+ coreutils/ln.c                              |  2 +-
+ coreutils/logname.c                         |  2 +-
+ coreutils/md5_sha1_sum.c                    |  2 +-
+ coreutils/od_bloaty.c                       | 12 ++---
+ coreutils/paste.c                           |  2 +-
+ coreutils/printf.c                          |  2 +-
+ coreutils/rm.c                              |  2 +-
+ coreutils/sort.c                            | 12 ++---
+ coreutils/split.c                           |  4 +-
+ coreutils/stty.c                            |  6 +--
+ coreutils/tail.c                            |  4 +-
+ coreutils/test.c                            |  4 +-
+ coreutils/tr.c                              |  4 +-
+ coreutils/uudecode.c                        |  8 ++--
+ coreutils/uuencode.c                        |  2 +-
+ debianutils/start_stop_daemon.c             |  4 +-
+ e2fsprogs/chattr.c                          |  6 +--
+ e2fsprogs/fsck.c                            |  6 +--
+ editors/awk.c                               |  4 +-
+ editors/diff.c                              |  4 +-
+ editors/ed.c                                | 34 +++++++-------
+ editors/patch_bbox.c                        |  6 +--
+ editors/patch_toybox.c                      |  2 +-
+ editors/sed.c                               | 18 ++++----
+ editors/vi.c                                |  2 +-
+ findutils/find.c                            |  4 +-
+ findutils/xargs.c                           |  4 +-
+ include/libbb.h                             | 45 ++++++++++++++++++-
+ init/bootchartd.c                           |  2 +-
+ init/init.c                                 |  2 +-
+ libbb/appletlib.c                           | 10 ++---
+ libbb/bb_getgroups.c                        |  2 +-
+ libbb/bbunit.c                              |  2 +-
+ libbb/capability.c                          |  2 +-
+ libbb/change_identity.c                     |  2 +-
+ libbb/copy_file.c                           |  2 +-
+ libbb/copyfd.c                              |  6 +--
+ libbb/die_if_bad_username.c                 |  2 +-
+ libbb/dump.c                                |  4 +-
+ libbb/fflush_stdout_and_exit.c              |  2 +-
+ libbb/get_console.c                         |  2 +-
+ libbb/get_volsize.c                         |  4 +-
+ libbb/getpty.c                              |  6 +--
+ libbb/herror_msg.c                          | 10 +++++
+ libbb/mtab.c                                |  4 +-
+ libbb/perror_nomsg.c                        |  4 +-
+ libbb/perror_nomsg_and_die.c                |  4 +-
+ libbb/read_printf.c                         |  2 +-
+ libbb/safe_poll.c                           |  2 +-
+ libbb/selinux_common.c                      |  2 +-
+ libbb/time.c                                |  2 +-
+ libbb/update_passwd.c                       |  4 +-
+ libbb/uuencode.c                            |  2 +-
+ libbb/verror_msg.c                          | 15 +++++++
+ libbb/warn_ignoring_args.c                  |  2 +-
+ libbb/xconnect.c                            |  4 +-
+ libbb/xfuncs.c                              |  2 +-
+ libbb/xfuncs_printf.c                       | 44 +++++++++---------
+ libbb/xgetcwd.c                             |  2 +-
+ libbb/xgethostbyname.c                      |  2 +-
+ loginutils/addgroup.c                       |  2 +-
+ loginutils/adduser.c                        |  4 +-
+ loginutils/chpasswd.c                       |  4 +-
+ loginutils/deluser.c                        |  2 +-
+ loginutils/getty.c                          | 16 +++----
+ loginutils/login.c                          |  4 +-
+ loginutils/su.c                             |  4 +-
+ loginutils/sulogin.c                        |  8 ++--
+ mailutils/mail.c                            |  6 +--
+ mailutils/popmaildir.c                      |  2 +-
+ mailutils/sendmail.c                        |  2 +-
+ miscutils/bc.c                              | 12 ++---
+ miscutils/chat.c                            |  2 +-
+ miscutils/crond.c                           |  4 +-
+ miscutils/crontab.c                         |  2 +-
+ miscutils/dc.c                              |  4 +-
+ miscutils/devfsd.c                          | 15 ++++---
+ miscutils/devmem.c                          |  8 ++--
+ miscutils/fbsplash.c                        |  2 +-
+ miscutils/flash_eraseall.c                  |  6 +--
+ miscutils/hdparm.c                          | 12 ++---
+ miscutils/hexedit.c                         |  2 +-
+ miscutils/i2c_tools.c                       | 44 +++++++++---------
+ miscutils/inotifyd.c                        |  2 +-
+ miscutils/nandwrite.c                       | 10 ++---
+ miscutils/rfkill.c                          |  2 +-
+ miscutils/rx.c                              |  6 +--
+ miscutils/time.c                            |  2 +-
+ miscutils/ubi_tools.c                       | 10 ++---
+ miscutils/ubirename.c                       |  2 +-
+ modutils/modutils-24.c                      | 26 +++++------
+ modutils/rmmod.c                            |  2 +-
+ networking/arp.c                            | 36 +++++++--------
+ networking/arping.c                         |  4 +-
+ networking/dnsd.c                           |  8 ++--
+ networking/ether-wake.c                     |  4 +-
+ networking/ftpgetput.c                      |  2 +-
+ networking/hostname.c                       |  2 +-
+ networking/httpd.c                          | 10 ++---
+ networking/ifconfig.c                       |  2 +-
+ networking/ifplugd.c                        | 16 +++----
+ networking/ifupdown.c                       |  4 +-
+ networking/inetd.c                          | 20 ++++-----
+ networking/ipcalc.c                         |  2 +-
+ networking/isrv.c                           |  4 +-
+ networking/libiproute/ipaddress.c           | 10 ++---
+ networking/libiproute/ipneigh.c             |  8 ++--
+ networking/libiproute/iproute.c             | 12 ++---
+ networking/libiproute/iptunnel.c            | 10 ++---
+ networking/libiproute/libnetlink.c          | 30 ++++++-------
+ networking/libiproute/utils.c               |  2 +-
+ networking/nbd-client.c                     | 10 ++---
+ networking/nc.c                             |  6 +--
+ networking/nc_bloaty.c                      | 18 ++++----
+ networking/netstat.c                        |  4 +-
+ networking/nslookup.c                       |  2 +-
+ networking/ntpd.c                           | 20 ++++-----
+ networking/ping.c                           | 16 +++----
+ networking/route.c                          |  6 +--
+ networking/slattach.c                       |  4 +-
+ networking/tcpudp.c                         |  6 +--
+ networking/telnetd.c                        |  2 +-
+ networking/tftp.c                           | 10 ++---
+ networking/tls.c                            | 14 +++---
+ networking/tls.h                            |  2 +-
+ networking/traceroute.c                     |  6 +--
+ networking/udhcp/arpping.c                  |  4 +-
+ networking/udhcp/common.c                   |  2 +-
+ networking/udhcp/common.h                   | 19 ++++++++
+ networking/udhcp/d6_dhcpc.c                 | 34 +++++++-------
+ networking/udhcp/d6_packet.c                |  4 +-
+ networking/udhcp/d6_socket.c                |  2 +-
+ networking/udhcp/dhcpc.c                    | 50 ++++++++++-----------
+ networking/udhcp/dhcpd.c                    | 24 +++++-----
+ networking/udhcp/dhcprelay.c                |  4 +-
+ networking/udhcp/packet.c                   |  4 +-
+ networking/udhcp/signalpipe.c               |  2 +-
+ networking/udhcp/socket.c                   |  2 +-
+ networking/wget.c                           | 22 ++++-----
+ networking/zcip.c                           |  6 +--
+ printutils/lpr.c                            | 12 ++---
+ procps/kill.c                               |  2 +-
+ procps/mpstat.c                             |  2 +-
+ procps/powertop.c                           |  4 +-
+ procps/pstree.c                             |  2 +-
+ procps/top.c                                |  2 +-
+ runit/chpst.c                               |  6 +--
+ runit/svlogd.c                              |  2 +-
+ selinux/chcon.c                             |  4 +-
+ selinux/getenforce.c                        |  4 +-
+ selinux/getsebool.c                         |  2 +-
+ selinux/load_policy.c                       |  2 +-
+ selinux/runcon.c                            |  6 +--
+ selinux/sestatus.c                          |  2 +-
+ selinux/setenforce.c                        |  2 +-
+ selinux/setfiles.c                          |  2 +-
+ selinux/setsebool.c                         |  2 +-
+ shell/hush.c                                | 32 ++++++-------
+ shell/shell_common.c                        |  2 +-
+ sysklogd/klogd.c                            |  2 +-
+ sysklogd/logread.c                          |  2 +-
+ sysklogd/syslogd.c                          | 10 ++---
+ util-linux/acpid.c                          |  2 +-
+ util-linux/dmesg.c                          |  4 +-
+ util-linux/eject.c                          |  2 +-
+ util-linux/fdformat.c                       |  2 +-
+ util-linux/fdisk.c                          |  2 +-
+ util-linux/flock.c                          |  2 +-
+ util-linux/fsck_minix.c                     |  2 +-
+ util-linux/getopt.c                         |  6 +--
+ util-linux/hwclock.c                        |  4 +-
+ util-linux/ipcs.c                           |  8 ++--
+ util-linux/last.c                           |  2 +-
+ util-linux/losetup.c                        |  4 +-
+ util-linux/mdev.c                           | 10 ++++-
+ util-linux/mesg.c                           |  2 +-
+ util-linux/mkfs_ext2.c                      |  6 +--
+ util-linux/mkfs_minix.c                     | 22 ++++-----
+ util-linux/mkfs_reiser.c                    |  2 +-
+ util-linux/mkfs_vfat.c                      |  6 +--
+ util-linux/mkswap.c                         |  2 +-
+ util-linux/mount.c                          | 40 ++++++++---------
+ util-linux/nsenter.c                        |  2 +-
+ util-linux/rdate.c                          |  6 +--
+ util-linux/readprofile.c                    |  4 +-
+ util-linux/rtcwake.c                        |  2 +-
+ util-linux/setpriv.c                        |  8 ++--
+ util-linux/switch_root.c                    |  6 +--
+ util-linux/uevent.c                         |  4 +-
+ util-linux/unshare.c                        |  2 +-
+ 225 files changed, 845 insertions(+), 736 deletions(-)
+
+diff --git a/Config.in b/Config.in
+index 1a726f043..14f54aacc 100644
+--- a/Config.in
++++ b/Config.in
+@@ -661,6 +661,19 @@ config WERROR
+ 
+ 	Most people should answer N.
+ 
++config WARN_SIMPLE_MSG
++	bool "Warn about single parameter bb_xx_msg calls"
++	default n
++	help
++	This will cause warnings to be shown for any instances of
++	bb_error_msg(), bb_error_msg_and_die(), bb_perror_msg(),
++	bb_perror_msg_and_die(), bb_herror_msg() or bb_herror_msg_and_die()
++	being called with a single parameter. In these cases the equivalent
++	bb_simple_xx_msg function should be used instead.
++	Note that use of STRERROR_FMT may give false positives.
++
++	If you aren't developing busybox, say N here.
++
+ choice
+ 	prompt "Additional debugging library"
+ 	default NO_DEBUG_LIB
+diff --git a/archival/bbunzip.c b/archival/bbunzip.c
+index 93f30d324..d31aaf7f3 100644
+--- a/archival/bbunzip.c
++++ b/archival/bbunzip.c
+@@ -114,7 +114,7 @@ int FAST_FUNC bbunpack(char **argv,
+ 
+ 		/* Check that the input is sane */
+ 		if (!(option_mask32 & BBUNPK_OPT_FORCE) && isatty(STDIN_FILENO)) {
+-			bb_error_msg_and_die("compressed data not read from terminal, "
++			bb_simple_error_msg_and_die("compressed data not read from terminal, "
+ 					"use -f to force it");
+ 		}
+ 
+diff --git a/archival/bzip2.c b/archival/bzip2.c
+index 38cc0219a..d0390a92a 100644
+--- a/archival/bzip2.c
++++ b/archival/bzip2.c
+@@ -145,7 +145,7 @@ IF_DESKTOP(long long) int bz_write(bz_stream *strm, void* rbuf, ssize_t rlen, vo
+ 			if (n2 != n) {
+ 				if (n2 >= 0)
+ 					errno = 0; /* prevent bogus error message */
+-				bb_perror_msg(n2 >= 0 ? "short write" : bb_msg_write_error);
++				bb_simple_perror_msg(n2 >= 0 ? "short write" : bb_msg_write_error);
+ 				return -1;
+ 			}
+ 		}
+@@ -187,7 +187,7 @@ IF_DESKTOP(long long) int FAST_FUNC compressStream(transformer_state_t *xstate U
+ 	while (1) {
+ 		count = full_read(STDIN_FILENO, rbuf, IOBUF_SIZE);
+ 		if (count < 0) {
+-			bb_perror_msg(bb_msg_read_error);
++			bb_simple_perror_msg(bb_msg_read_error);
+ 			total = -1;
+ 			break;
+ 		}
+diff --git a/archival/dpkg.c b/archival/dpkg.c
+index ddb5daf09..da77fba05 100644
+--- a/archival/dpkg.c
++++ b/archival/dpkg.c
+@@ -487,7 +487,7 @@ static void add_split_dependencies(common_node_t *parent_node, const char *whole
+ 					} else if (strncmp(version, ">=", offset_ch) == 0) {
+ 						edge->operator = VER_MORE_EQUAL;
+ 					} else {
+-						bb_error_msg_and_die("illegal operator");
++						bb_simple_error_msg_and_die("illegal operator");
+ 					}
+ 				}
+ 				/* skip to start of version numbers */
+@@ -730,7 +730,7 @@ static void set_status(const unsigned status_node_num, const char *new_value, co
+ 			status = new_value_num;
+ 			break;
+ 		default:
+-			bb_error_msg_and_die("DEBUG ONLY: this shouldnt happen");
++			bb_simple_error_msg_and_die("DEBUG ONLY: this shouldnt happen");
+ 	}
+ 
+ 	new_status = xasprintf("%s %s %s", name_hashtable[want], name_hashtable[flag], name_hashtable[status]);
+@@ -944,10 +944,10 @@ static void write_status_file(deb_file_t **deb_file)
+ 	/* Create a separate backfile to dpkg */
+ 	if (rename("/var/lib/dpkg/status", "/var/lib/dpkg/status.udeb.bak") == -1) {
+ 		if (errno != ENOENT)
+-			bb_error_msg_and_die("can't create backup status file");
++			bb_simple_error_msg_and_die("can't create backup status file");
+ 		/* Its ok if renaming the status file fails because status
+ 		 * file doesn't exist, maybe we are starting from scratch */
+-		bb_error_msg("no status file found, creating new one");
++		bb_simple_error_msg("no status file found, creating new one");
+ 	}
+ 
+ 	xrename("/var/lib/dpkg/status.udeb", "/var/lib/dpkg/status");
+@@ -1816,7 +1816,7 @@ int dpkg_main(int argc UNUSED_PARAM, char **argv)
+ 			init_archive_deb_control(archive_handle);
+ 			deb_file[deb_count]->control_file = deb_extract_control_file_to_buffer(archive_handle, control_list);
+ 			if (deb_file[deb_count]->control_file == NULL) {
+-				bb_error_msg_and_die("can't extract control file");
++				bb_simple_error_msg_and_die("can't extract control file");
+ 			}
+ 			deb_file[deb_count]->filename = xstrdup(argv[0]);
+ 			package_num = fill_package_struct(deb_file[deb_count]->control_file);
+@@ -1879,13 +1879,13 @@ int dpkg_main(int argc UNUSED_PARAM, char **argv)
+ 		argv++;
+ 	}
+ 	if (!deb_count)
+-		bb_error_msg_and_die("no package files specified");
++		bb_simple_error_msg_and_die("no package files specified");
+ 	deb_file[deb_count] = NULL;
+ 
+ 	/* Check that the deb file arguments are installable */
+ 	if (!(opt & OPT_force_ignore_depends)) {
+ 		if (!check_deps(deb_file, 0 /*, deb_count*/)) {
+-			bb_error_msg_and_die("dependency check failed");
++			bb_simple_error_msg_and_die("dependency check failed");
+ 		}
+ 	}
+ 
+diff --git a/archival/gzip.c b/archival/gzip.c
+index 12c1df242..17341de45 100644
+--- a/archival/gzip.c
++++ b/archival/gzip.c
+@@ -99,7 +99,7 @@ aa:      85.1% -- replaced with aa.gz
+ /* Diagnostic functions */
+ #ifdef DEBUG
+ static int verbose;
+-#  define Assert(cond,msg) { if (!(cond)) bb_error_msg(msg); }
++#  define Assert(cond,msg) { if (!(cond)) bb_simple_error_msg(msg); }
+ #  define Trace(x) fprintf x
+ #  define Tracev(x) {if (verbose) fprintf x; }
+ #  define Tracevv(x) {if (verbose > 1) fprintf x; }
+@@ -787,7 +787,7 @@ static void check_match(IPos start, IPos match, int length)
+ 	/* check that the match is indeed a match */
+ 	if (memcmp(G1.window + match, G1.window + start, length) != 0) {
+ 		bb_error_msg(" start %d, match %d, length %d", start, match, length);
+-		bb_error_msg("invalid match");
++		bb_simple_error_msg("invalid match");
+ 	}
+ 	if (verbose > 1) {
+ 		bb_error_msg("\\[%d,%d]", start - match, length);
+diff --git a/archival/libarchive/data_extract_all.c b/archival/libarchive/data_extract_all.c
+index 4c95db4a6..3142405a3 100644
+--- a/archival/libarchive/data_extract_all.c
++++ b/archival/libarchive/data_extract_all.c
+@@ -103,7 +103,7 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle)
+ 		struct stat existing_sb;
+ 		if (lstat(dst_name, &existing_sb) == -1) {
+ 			if (errno != ENOENT) {
+-				bb_perror_msg_and_die("can't stat old file");
++				bb_simple_perror_msg_and_die("can't stat old file");
+ 			}
+ 		}
+ 		else if (existing_sb.st_mtime >= file_header->mtime) {
+@@ -207,7 +207,7 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle)
+ 		}
+ 		break;
+ 	default:
+-		bb_error_msg_and_die("unrecognized file type");
++		bb_simple_error_msg_and_die("unrecognized file type");
+ 	}
+ 
+ 	if (!S_ISLNK(file_header->mode)) {
+diff --git a/archival/libarchive/decompress_bunzip2.c b/archival/libarchive/decompress_bunzip2.c
+index 1f535b32a..42e2b4f88 100644
+--- a/archival/libarchive/decompress_bunzip2.c
++++ b/archival/libarchive/decompress_bunzip2.c
+@@ -817,7 +817,7 @@ unpack_bz2_stream(transformer_state_t *xstate)
+ 			break;
+ 		}
+ 		if (bd->headerCRC != bd->totalCRC) {
+-			bb_error_msg("CRC error");
++			bb_simple_error_msg("CRC error");
+ 			break;
+ 		}
+ 
+diff --git a/archival/libarchive/decompress_gunzip.c b/archival/libarchive/decompress_gunzip.c
+index 7f9046b82..1ddce610c 100644
+--- a/archival/libarchive/decompress_gunzip.c
++++ b/archival/libarchive/decompress_gunzip.c
+@@ -1012,7 +1012,7 @@ inflate_unzip_internal(STATE_PARAM transformer_state_t *xstate)
+ 	error_msg = "corrupted data";
+ 	if (setjmp(error_jmp)) {
+ 		/* Error from deep inside zip machinery */
+-		bb_error_msg(error_msg);
++		bb_simple_error_msg(error_msg);
+ 		n = -1;
+ 		goto ret;
+ 	}
+@@ -1085,7 +1085,7 @@ static int top_up(STATE_PARAM unsigned n)
+ 		bytebuffer_offset = 0;
+ 		bytebuffer_size = full_read(gunzip_src_fd, &bytebuffer[count], bytebuffer_max - count);
+ 		if ((int)bytebuffer_size < 0) {
+-			bb_error_msg(bb_msg_read_error);
++			bb_simple_error_msg(bb_msg_read_error);
+ 			return 0;
+ 		}
+ 		bytebuffer_size += count;
+@@ -1211,7 +1211,7 @@ unpack_gz_stream(transformer_state_t *xstate)
+ 
+ 		if (full_read(xstate->src_fd, &magic2, 2) != 2) {
+  bad_magic:
+-			bb_error_msg("invalid magic");
++			bb_simple_error_msg("invalid magic");
+ 			return -1;
+ 		}
+ 		if (magic2 == COMPRESS_MAGIC) {
+@@ -1233,7 +1233,7 @@ unpack_gz_stream(transformer_state_t *xstate)
+ 
+  again:
+ 	if (!check_header_gzip(PASS_STATE xstate)) {
+-		bb_error_msg("corrupted data");
++		bb_simple_error_msg("corrupted data");
+ 		total = -1;
+ 		goto ret;
+ 	}
+@@ -1246,7 +1246,7 @@ unpack_gz_stream(transformer_state_t *xstate)
+ 	total += n;
+ 
+ 	if (!top_up(PASS_STATE 8)) {
+-		bb_error_msg("corrupted data");
++		bb_simple_error_msg("corrupted data");
+ 		total = -1;
+ 		goto ret;
+ 	}
+@@ -1254,7 +1254,7 @@ unpack_gz_stream(transformer_state_t *xstate)
+ 	/* Validate decompression - crc */
+ 	v32 = buffer_read_le_u32(PASS_STATE_ONLY);
+ 	if ((~gunzip_crc) != v32) {
+-		bb_error_msg("crc error");
++		bb_simple_error_msg("crc error");
+ 		total = -1;
+ 		goto ret;
+ 	}
+@@ -1262,7 +1262,7 @@ unpack_gz_stream(transformer_state_t *xstate)
+ 	/* Validate decompression - size */
+ 	v32 = buffer_read_le_u32(PASS_STATE_ONLY);
+ 	if ((uint32_t)gunzip_bytes_out != v32) {
+-		bb_error_msg("incorrect length");
++		bb_simple_error_msg("incorrect length");
+ 		total = -1;
+ 	}
+ 
+diff --git a/archival/libarchive/decompress_uncompress.c b/archival/libarchive/decompress_uncompress.c
+index 1517559c6..2725a7f09 100644
+--- a/archival/libarchive/decompress_uncompress.c
++++ b/archival/libarchive/decompress_uncompress.c
+@@ -113,7 +113,7 @@ unpack_Z_stream(transformer_state_t *xstate)
+ 	/* xread isn't good here, we have to return - caller may want
+ 	 * to do some cleanup (e.g. delete incomplete unpacked file etc) */
+ 	if (full_read(xstate->src_fd, inbuf, 1) != 1) {
+-		bb_error_msg("short read");
++		bb_simple_error_msg("short read");
+ 		goto err;
+ 	}
+ 
+@@ -166,7 +166,7 @@ unpack_Z_stream(transformer_state_t *xstate)
+ 		if (insize < (int) (IBUFSIZ + 64) - IBUFSIZ) {
+ 			rsize = safe_read(xstate->src_fd, inbuf + insize, IBUFSIZ);
+ 			if (rsize < 0)
+-				bb_error_msg_and_die(bb_msg_read_error);
++				bb_simple_error_msg_and_die(bb_msg_read_error);
+ 			insize += rsize;
+ 		}
+ 
+@@ -200,7 +200,7 @@ unpack_Z_stream(transformer_state_t *xstate)
+ 
+ 			if (oldcode == -1) {
+ 				if (code >= 256)
+-					bb_error_msg_and_die("corrupted data"); /* %ld", code); */
++					bb_simple_error_msg_and_die("corrupted data"); /* %ld", code); */
+ 				oldcode = code;
+ 				finchar = (int) oldcode;
+ 				outbuf[outpos++] = (unsigned char) finchar;
+@@ -236,7 +236,7 @@ unpack_Z_stream(transformer_state_t *xstate)
+ 						insize, posbits, p[-1], p[0], p[1], p[2], p[3],
+ 						(posbits & 07));
+ */
+-					bb_error_msg("corrupted data");
++					bb_simple_error_msg("corrupted data");
+ 					goto err;
+ 				}
+ 
+@@ -247,7 +247,7 @@ unpack_Z_stream(transformer_state_t *xstate)
+ 			/* Generate output characters in reverse order */
+ 			while (code >= 256) {
+ 				if (stackp <= &htabof(0))
+-					bb_error_msg_and_die("corrupted data");
++					bb_simple_error_msg_and_die("corrupted data");
+ 				*--stackp = tab_suffixof(code);
+ 				code = tab_prefixof(code);
+ 			}
+diff --git a/archival/libarchive/decompress_unlzma.c b/archival/libarchive/decompress_unlzma.c
+index 668b01618..0744f231a 100644
+--- a/archival/libarchive/decompress_unlzma.c
++++ b/archival/libarchive/decompress_unlzma.c
+@@ -59,7 +59,7 @@ static void rc_read(rc_t *rc)
+ //TODO: return -1 instead
+ //This will make unlzma delete broken unpacked file on unpack errors
+ 	if (buffer_size <= 0)
+-		bb_error_msg_and_die("unexpected EOF");
++		bb_simple_error_msg_and_die("unexpected EOF");
+ 	rc->buffer_end = RC_BUFFER + buffer_size;
+ 	rc->ptr = RC_BUFFER;
+ }
+@@ -234,7 +234,7 @@ unpack_lzma_stream(transformer_state_t *xstate)
+ 	if (full_read(xstate->src_fd, &header, sizeof(header)) != sizeof(header)
+ 	 || header.pos >= (9 * 5 * 5)
+ 	) {
+-		bb_error_msg("bad lzma header");
++		bb_simple_error_msg("bad lzma header");
+ 		return -1;
+ 	}
+ 
+@@ -513,7 +513,7 @@ unpack_lzma_stream(transformer_state_t *xstate)
+ 			 * potentially more detailed information).
+ 			 * Do not fail silently.
+ 			 */
+-			bb_error_msg("corrupted data");
++			bb_simple_error_msg("corrupted data");
+ 			total_written = -1; /* failure */
+ 		}
+ 		rc_free(rc);
+diff --git a/archival/libarchive/decompress_unxz.c b/archival/libarchive/decompress_unxz.c
+index 8ae7a275b..f03341384 100644
+--- a/archival/libarchive/decompress_unxz.c
++++ b/archival/libarchive/decompress_unxz.c
+@@ -74,7 +74,7 @@ unpack_xz_stream(transformer_state_t *xstate)
+ 		if (iobuf.in_pos == iobuf.in_size) {
+ 			int rd = safe_read(xstate->src_fd, membuf, BUFSIZ);
+ 			if (rd < 0) {
+-				bb_error_msg(bb_msg_read_error);
++				bb_simple_error_msg(bb_msg_read_error);
+ 				total = -1;
+ 				break;
+ 			}
+@@ -123,7 +123,7 @@ unpack_xz_stream(transformer_state_t *xstate)
+ 			continue;
+ 		}
+ 		if (xz_result != XZ_OK && xz_result != XZ_UNSUPPORTED_CHECK) {
+-			bb_error_msg("corrupted data");
++			bb_simple_error_msg("corrupted data");
+ 			total = -1;
+ 			break;
+ 		}
+diff --git a/archival/libarchive/get_header_ar.c b/archival/libarchive/get_header_ar.c
+index 7ce9c615c..b6ecd596c 100644
+--- a/archival/libarchive/get_header_ar.c
++++ b/archival/libarchive/get_header_ar.c
+@@ -22,7 +22,7 @@ static unsigned read_num(char *str, int base, int len)
+ 	 * on misformatted numbers bb_strtou returns all-ones */
+ 	err = bb_strtou(str, NULL, base);
+ 	if (err == -1)
+-		bb_error_msg_and_die("invalid ar header");
++		bb_simple_error_msg_and_die("invalid ar header");
+ 	return err;
+ }
+ 
+@@ -53,7 +53,7 @@ char FAST_FUNC get_header_ar(archive_handle_t *archive_handle)
+ 	archive_handle->offset += 60;
+ 
+ 	if (ar.formatted.magic[0] != '`' || ar.formatted.magic[1] != '\n')
+-		bb_error_msg_and_die("invalid ar header");
++		bb_simple_error_msg_and_die("invalid ar header");
+ 
+ 	/*
+ 	 * Note that the fields MUST be read in reverse order as
+@@ -86,7 +86,7 @@ char FAST_FUNC get_header_ar(archive_handle_t *archive_handle)
+ 			return get_header_ar(archive_handle);
+ 		}
+ #else
+-		bb_error_msg_and_die("long filenames not supported");
++		bb_simple_error_msg_and_die("long filenames not supported");
+ #endif
+ 	}
+ 	/* Only size is always present, the rest may be missing in
+@@ -107,7 +107,7 @@ char FAST_FUNC get_header_ar(archive_handle_t *archive_handle)
+ 		long_offset = read_num(&ar.formatted.name[1], 10,
+ 				       sizeof(ar.formatted.name) - 1);
+ 		if (long_offset >= archive_handle->ar__long_name_size) {
+-			bb_error_msg_and_die("can't resolve long filename");
++			bb_simple_error_msg_and_die("can't resolve long filename");
+ 		}
+ 		typed->name = xstrdup(archive_handle->ar__long_names + long_offset);
+ 	} else
+diff --git a/archival/libarchive/get_header_cpio.c b/archival/libarchive/get_header_cpio.c
+index 75fc6a406..4ad174732 100644
+--- a/archival/libarchive/get_header_cpio.c
++++ b/archival/libarchive/get_header_cpio.c
+@@ -33,14 +33,14 @@ char FAST_FUNC get_header_cpio(archive_handle_t *archive_handle)
+ 		goto create_hardlinks;
+ 	}
+ 	if (size != 110) {
+-		bb_error_msg_and_die("short read");
++		bb_simple_error_msg_and_die("short read");
+ 	}
+ 	archive_handle->offset += 110;
+ 
+ 	if (!is_prefixed_with(&cpio_header[0], "07070")
+ 	 || (cpio_header[5] != '1' && cpio_header[5] != '2')
+ 	) {
+-		bb_error_msg_and_die("unsupported cpio format, use newc or crc");
++		bb_simple_error_msg_and_die("unsupported cpio format, use newc or crc");
+ 	}
+ 
+ 	if (sscanf(cpio_header + 6,
+@@ -50,7 +50,7 @@ char FAST_FUNC get_header_cpio(archive_handle_t *archive_handle)
+ 			&inode, &mode, &uid, &gid,
+ 			&nlink, &mtime, &size,
+ 			&major, &minor, &namesize) != 10)
+-		bb_error_msg_and_die("damaged cpio file");
++		bb_simple_error_msg_and_die("damaged cpio file");
+ 	file_header->mode = mode;
+ 	/* "cpio -R USER:GRP" support: */
+ 	if (archive_handle->cpio__owner.uid != (uid_t)-1L)
+diff --git a/archival/libarchive/get_header_tar.c b/archival/libarchive/get_header_tar.c
+index 52fa4554a..b3131ff2d 100644
+--- a/archival/libarchive/get_header_tar.c
++++ b/archival/libarchive/get_header_tar.c
+@@ -32,7 +32,7 @@ static unsigned long long getOctal(char *str, int len)
+ 	if (*end != '\0' && *end != ' ') {
+ 		int8_t first = str[0];
+ 		if (!(first & 0x80))
+-			bb_error_msg_and_die("corrupted octal value in tar header");
++			bb_simple_error_msg_and_die("corrupted octal value in tar header");
+ 		/*
+ 		 * GNU tar uses "base-256 encoding" for very large numbers.
+ 		 * Encoding is binary, with highest bit always set as a marker
+@@ -100,7 +100,7 @@ static void process_pax_hdr(archive_handle_t *archive_handle, unsigned sz, int g
+ 		 || errno != EINVAL
+ 		 || *end != ' '
+ 		) {
+-			bb_error_msg("malformed extended header, skipped");
++			bb_simple_error_msg("malformed extended header, skipped");
+ 			// More verbose version:
+ 			//bb_error_msg("malformed extended header at %"OFF_FMT"d, skipped",
+ 			//		archive_handle->offset - (sz + len));
+@@ -194,13 +194,13 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
+ 		 * the very first read fails. Grrr.
+ 		 */
+ 		if (archive_handle->offset == 0)
+-			bb_error_msg("short read");
++			bb_simple_error_msg("short read");
+ 		/* this merely signals end of archive, not exit(1): */
+ 		return EXIT_FAILURE;
+ 	}
+ 	if (i != 512) {
+ 		IF_FEATURE_TAR_AUTODETECT(goto autodetect;)
+-		bb_error_msg_and_die("short read");
++		bb_simple_error_msg_and_die("short read");
+ 	}
+ 
+ #else
+@@ -243,11 +243,11 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
+ 			goto err;
+ 		if (setup_unzip_on_fd(archive_handle->src_fd, /*fail_if_not_compressed:*/ 0) != 0)
+  err:
+-			bb_error_msg_and_die("invalid tar magic");
++			bb_simple_error_msg_and_die("invalid tar magic");
+ 		archive_handle->offset = 0;
+ 		goto again_after_align;
+ #endif
+-		bb_error_msg_and_die("invalid tar magic");
++		bb_simple_error_msg_and_die("invalid tar magic");
+ 	}
+ 
+ 	/* Do checksum on headers.
+@@ -282,7 +282,7 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
+ 	if (sum_u != sum
+ 	    IF_FEATURE_TAR_OLDSUN_COMPATIBILITY(&& sum_s != sum)
+ 	) {
+-		bb_error_msg_and_die("invalid tar header checksum");
++		bb_simple_error_msg_and_die("invalid tar header checksum");
+ 	}
+ 
+ 	/* GET_OCTAL trashes subsequent field, therefore we call it
+diff --git a/archival/libarchive/open_transformer.c b/archival/libarchive/open_transformer.c
+index a90f42a45..44715ef25 100644
+--- a/archival/libarchive/open_transformer.c
++++ b/archival/libarchive/open_transformer.c
+@@ -15,7 +15,7 @@ int FAST_FUNC check_signature16(transformer_state_t *xstate, unsigned magic16)
+ 	if (!xstate->signature_skipped) {
+ 		uint16_t magic2;
+ 		if (full_read(xstate->src_fd, &magic2, 2) != 2 || magic2 != magic16) {
+-			bb_error_msg("invalid magic");
++			bb_simple_error_msg("invalid magic");
+ 			return -1;
+ 		}
+ 		xstate->signature_skipped = 2;
+@@ -46,7 +46,7 @@ ssize_t FAST_FUNC transformer_write(transformer_state_t *xstate, const void *buf
+ 	} else {
+ 		nwrote = full_write(xstate->dst_fd, buf, bufsize);
+ 		if (nwrote != (ssize_t)bufsize) {
+-			bb_perror_msg("write");
++			bb_simple_perror_msg("write");
+ 			nwrote = -1;
+ 			goto ret;
+ 		}
+@@ -205,7 +205,7 @@ static transformer_state_t *setup_transformer_on_fd(int fd, int fail_if_not_comp
+ 
+ 	/* No known magic seen */
+ 	if (fail_if_not_compressed)
+-		bb_error_msg_and_die("no gzip"
++		bb_simple_error_msg_and_die("no gzip"
+ 			IF_FEATURE_SEAMLESS_BZ2("/bzip2")
+ 			IF_FEATURE_SEAMLESS_XZ("/xz")
+ 			" magic");
+diff --git a/archival/libarchive/seek_by_jump.c b/archival/libarchive/seek_by_jump.c
+index 232d97e53..dddaa3732 100644
+--- a/archival/libarchive/seek_by_jump.c
++++ b/archival/libarchive/seek_by_jump.c
+@@ -13,6 +13,6 @@ void FAST_FUNC seek_by_jump(int fd, off_t amount)
+ 		if (errno == ESPIPE)
+ 			seek_by_read(fd, amount);
+ 		else
+-			bb_perror_msg_and_die("seek failure");
++			bb_simple_perror_msg_and_die("seek failure");
+ 	}
+ }
+diff --git a/archival/libarchive/unpack_ar_archive.c b/archival/libarchive/unpack_ar_archive.c
+index 4f9f89874..584c18ce8 100644
+--- a/archival/libarchive/unpack_ar_archive.c
++++ b/archival/libarchive/unpack_ar_archive.c
+@@ -12,7 +12,7 @@ void FAST_FUNC unpack_ar_archive(archive_handle_t *ar_archive)
+ 
+ 	xread(ar_archive->src_fd, magic, AR_MAGIC_LEN);
+ 	if (!is_prefixed_with(magic, AR_MAGIC)) {
+-		bb_error_msg_and_die("invalid ar magic");
++		bb_simple_error_msg_and_die("invalid ar magic");
+ 	}
+ 	ar_archive->offset += AR_MAGIC_LEN;
+ 
+diff --git a/archival/lzop.c b/archival/lzop.c
+index 585632c4e..bdd21598c 100644
+--- a/archival/lzop.c
++++ b/archival/lzop.c
+@@ -752,7 +752,7 @@ static FAST_FUNC void lzo_check(
+ 	 */
+ 	uint32_t c = fn(init, buf, len);
+ 	if (c != ref)
+-		bb_error_msg_and_die("checksum error");
++		bb_simple_error_msg_and_die("checksum error");
+ }
+ 
+ /**********************************************************************/
+@@ -785,15 +785,15 @@ static NOINLINE int lzo_decompress(uint32_t h_flags32)
+ 		/* error if split file */
+ 		if (dst_len == 0xffffffffL)
+ 			/* should not happen - not yet implemented */
+-			bb_error_msg_and_die("this file is a split lzop file");
++			bb_simple_error_msg_and_die("this file is a split lzop file");
+ 
+ 		if (dst_len > MAX_BLOCK_SIZE)
+-			bb_error_msg_and_die("corrupted data");
++			bb_simple_error_msg_and_die("corrupted data");
+ 
+ 		/* read compressed block size */
+ 		src_len = read32();
+ 		if (src_len <= 0 || src_len > dst_len)
+-			bb_error_msg_and_die("corrupted data");
++			bb_simple_error_msg_and_die("corrupted data");
+ 
+ 		if (dst_len > block_size) {
+ 			if (b2) {
+@@ -846,7 +846,7 @@ static NOINLINE int lzo_decompress(uint32_t h_flags32)
+ 				r = lzo1x_decompress_safe(b1, src_len, b2, &d /*, NULL*/);
+ 
+ 			if (r != 0 /*LZO_E_OK*/ || dst_len != d) {
+-				bb_error_msg_and_die("corrupted data");
++				bb_simple_error_msg_and_die("corrupted data");
+ 			}
+ 			dst = b2;
+ 		} else {
+@@ -913,7 +913,7 @@ static void check_magic(void)
+ 	unsigned char magic[sizeof(lzop_magic)];
+ 	xread(0, magic, sizeof(magic));
+ 	if (memcmp(magic, lzop_magic, sizeof(lzop_magic)) != 0)
+-		bb_error_msg_and_die("bad magic number");
++		bb_simple_error_msg_and_die("bad magic number");
+ }
+ 
+ /**********************************************************************/
+@@ -1049,7 +1049,7 @@ static void lzo_set_method(header_t *h)
+ 		else if (option_mask32 & OPT_8)
+ 			level = 8;
+ #else
+-		bb_error_msg_and_die("high compression not compiled in");
++		bb_simple_error_msg_and_die("high compression not compiled in");
+ #endif
+ 	}
+ 
+diff --git a/archival/rpm.c b/archival/rpm.c
+index 95b2531e8..68afba914 100644
+--- a/archival/rpm.c
++++ b/archival/rpm.c
+@@ -543,7 +543,7 @@ int rpm2cpio_main(int argc UNUSED_PARAM, char **argv)
+ 	}
+ 
+ 	if (bb_copyfd_eof(rpm_fd, STDOUT_FILENO) < 0)
+-		bb_error_msg_and_die("error unpacking");
++		bb_simple_error_msg_and_die("error unpacking");
+ 
+ 	if (ENABLE_FEATURE_CLEAN_UP) {
+ 		close(rpm_fd);
+diff --git a/archival/tar.c b/archival/tar.c
+index 3ef89fb0a..ca802f73c 100644
+--- a/archival/tar.c
++++ b/archival/tar.c
+@@ -369,7 +369,7 @@ static int writeTarHeader(struct TarBallInfo *tbInfo,
+ 		/* If it is larger than 100 bytes, bail out */
+ 		if (header.linkname[sizeof(header.linkname)-1]) {
+ 			free(lpath);
+-			bb_error_msg("names longer than "NAME_SIZE_STR" chars not supported");
++			bb_simple_error_msg("names longer than "NAME_SIZE_STR" chars not supported");
+ 			return FALSE;
+ 		}
+ # endif
+@@ -542,7 +542,7 @@ static int FAST_FUNC writeFileToTarball(const char *fileName, struct stat *statb
+ 
+ # if !ENABLE_FEATURE_TAR_GNU_EXTENSIONS
+ 	if (strlen(header_name) >= NAME_SIZE) {
+-		bb_error_msg("names longer than "NAME_SIZE_STR" chars not supported");
++		bb_simple_error_msg("names longer than "NAME_SIZE_STR" chars not supported");
+ 		return TRUE;
+ 	}
+ # endif
+@@ -715,13 +715,13 @@ static NOINLINE int writeTarFile(
+ 		freeHardLinkInfo(&tbInfo->hlInfoHead);
+ 
+ 	if (errorFlag)
+-		bb_error_msg("error exit delayed from previous errors");
++		bb_simple_error_msg("error exit delayed from previous errors");
+ 
+ # if SEAMLESS_COMPRESSION
+ 	if (gzip) {
+ 		int status;
+ 		if (safe_waitpid(-1, &status, 0) == -1)
+-			bb_perror_msg("waitpid");
++			bb_simple_perror_msg("waitpid");
+ 		else if (!WIFEXITED(status) || WEXITSTATUS(status))
+ 			/* gzip was killed or has exited with nonzero! */
+ 			errorFlag = TRUE;
+@@ -1150,7 +1150,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
+ 		if (opt & OPT_CREATE) {
+ 			/* Make sure there is at least one file to tar up */
+ 			if (tar_handle->accept == NULL)
+-				bb_error_msg_and_die("empty archive");
++				bb_simple_error_msg_and_die("empty archive");
+ 
+ 			tar_fd = STDOUT_FILENO;
+ 			/* Mimicking GNU tar 1.15.1: */
+diff --git a/archival/unzip.c b/archival/unzip.c
+index 466794031..8c4cb9881 100644
+--- a/archival/unzip.c
++++ b/archival/unzip.c
+@@ -322,7 +322,7 @@ static uint32_t read_next_cdf(uint32_t cdf_offset, cdf_header_t *cdf)
+ static void die_if_bad_fnamesize(unsigned sz)
+ {
+ 	if (sz > 0xfff) /* more than 4k?! no funny business please */
+-		bb_error_msg_and_die("bad archive");
++		bb_simple_error_msg_and_die("bad archive");
+ }
+ 
+ static void unzip_skip(off_t skip)
+@@ -359,7 +359,7 @@ static void unzip_extract_symlink(llist_t **symlink_placeholders,
+ 		xread(zip_fd, target, zip->fmt.ucmpsize);
+ 	} else {
+ #if 1
+-		bb_error_msg_and_die("compressed symlink is not supported");
++		bb_simple_error_msg_and_die("compressed symlink is not supported");
+ #else
+ 		transformer_state_t xstate;
+ 		init_transformer_state(&xstate);
+@@ -399,10 +399,10 @@ static void unzip_extract(zip_header_t *zip, int dst_fd)
+ 	if (zip->fmt.method == 8) {
+ 		/* Method 8 - inflate */
+ 		if (inflate_unzip(&xstate) < 0)
+-			bb_error_msg_and_die("inflate error");
++			bb_simple_error_msg_and_die("inflate error");
+ 		/* Validate decompression - crc */
+ 		if (zip->fmt.crc32 != (xstate.crc32 ^ 0xffffffffL)) {
+-			bb_error_msg_and_die("crc error");
++			bb_simple_error_msg_and_die("crc error");
+ 		}
+ 	}
+ #if ENABLE_FEATURE_UNZIP_BZIP2
+@@ -412,7 +412,7 @@ static void unzip_extract(zip_header_t *zip, int dst_fd)
+ 		 */
+ 		xstate.bytes_out = unpack_bz2_stream(&xstate);
+ 		if (xstate.bytes_out < 0)
+-			bb_error_msg_and_die("inflate error");
++			bb_simple_error_msg_and_die("inflate error");
+ 	}
+ #endif
+ #if ENABLE_FEATURE_UNZIP_LZMA
+@@ -420,7 +420,7 @@ static void unzip_extract(zip_header_t *zip, int dst_fd)
+ 		/* Not tested yet */
+ 		xstate.bytes_out = unpack_lzma_stream(&xstate);
+ 		if (xstate.bytes_out < 0)
+-			bb_error_msg_and_die("inflate error");
++			bb_simple_error_msg_and_die("inflate error");
+ 	}
+ #endif
+ #if ENABLE_FEATURE_UNZIP_XZ
+@@ -428,7 +428,7 @@ static void unzip_extract(zip_header_t *zip, int dst_fd)
+ 		/* Not tested yet */
+ 		xstate.bytes_out = unpack_xz_stream(&xstate);
+ 		if (xstate.bytes_out < 0)
+-			bb_error_msg_and_die("inflate error");
++			bb_simple_error_msg_and_die("inflate error");
+ 	}
+ #endif
+ 	else {
+@@ -439,7 +439,7 @@ static void unzip_extract(zip_header_t *zip, int dst_fd)
+ 	if (zip->fmt.ucmpsize != xstate.bytes_out) {
+ 		/* Don't die. Who knows, maybe len calculation
+ 		 * was botched somewhere. After all, crc matched! */
+-		bb_error_msg("bad length");
++		bb_simple_error_msg("bad length");
+ 	}
+ }
+ 
+@@ -447,7 +447,7 @@ static void my_fgets80(char *buf80)
+ {
+ 	fflush_all();
+ 	if (!fgets(buf80, 80, stdin)) {
+-		bb_perror_msg_and_die("can't read standard input");
++		bb_simple_perror_msg_and_die("can't read standard input");
+ 	}
+ }
+ 
+diff --git a/console-tools/loadfont.c b/console-tools/loadfont.c
+index b5d4e8f43..caad7d9ac 100644
+--- a/console-tools/loadfont.c
++++ b/console-tools/loadfont.c
+@@ -225,7 +225,7 @@ static void do_loadtable(int fd, unsigned char *inbuf, int tailsz, int fontsize,
+ 				if (unicode == PSF2_SEPARATOR) {
+ 					break;
+ 				} else if (unicode == PSF2_STARTSEQ) {
+-					bb_error_msg_and_die("unicode sequences not implemented");
++					bb_simple_error_msg_and_die("unicode sequences not implemented");
+ 				} else if (unicode >= 0xC0) {
+ 					if (unicode >= 0xFC)
+ 						unicode &= 0x01, maxct = 5;
+@@ -239,12 +239,12 @@ static void do_loadtable(int fd, unsigned char *inbuf, int tailsz, int fontsize,
+ 						unicode &= 0x1F, maxct = 1;
+ 					do {
+ 						if (tailsz <= 0 || *inbuf < 0x80 || *inbuf > 0xBF)
+-							bb_error_msg_and_die("illegal UTF-8 character");
++							bb_simple_error_msg_and_die("illegal UTF-8 character");
+ 						--tailsz;
+ 						unicode = (unicode << 6) + (*inbuf++ & 0x3F);
+ 					} while (--maxct > 0);
+ 				} else if (unicode >= 0x80) {
+-					bb_error_msg_and_die("illegal UTF-8 character");
++					bb_simple_error_msg_and_die("illegal UTF-8 character");
+ 				}
+ #else
+ 				return;
+@@ -281,7 +281,7 @@ static void do_load(int fd, unsigned char *buffer, size_t len)
+ 
+ 	if (len >= sizeof(struct psf1_header) && PSF1_MAGIC_OK(psf1h(buffer))) {
+ 		if (psf1h(buffer)->mode > PSF1_MAXMODE)
+-			bb_error_msg_and_die("unsupported psf file mode");
++			bb_simple_error_msg_and_die("unsupported psf file mode");
+ 		if (psf1h(buffer)->mode & PSF1_MODE512)
+ 			fontsize = 512;
+ 		if (psf1h(buffer)->mode & PSF1_MODEHASTAB)
+@@ -292,7 +292,7 @@ static void do_load(int fd, unsigned char *buffer, size_t len)
+ #if ENABLE_FEATURE_LOADFONT_PSF2
+ 	if (len >= sizeof(struct psf2_header) && PSF2_MAGIC_OK(psf2h(buffer))) {
+ 		if (psf2h(buffer)->version > PSF2_MAXVERSION)
+-			bb_error_msg_and_die("unsupported psf file version");
++			bb_simple_error_msg_and_die("unsupported psf file version");
+ 		fontsize = psf2h(buffer)->length;
+ 		if (psf2h(buffer)->flags & PSF2_HAS_UNICODE_TABLE)
+ 			has_table = 2;
+@@ -311,19 +311,19 @@ static void do_load(int fd, unsigned char *buffer, size_t len)
+ 	} else
+ #endif
+ 	{
+-		bb_error_msg_and_die("input file: bad length or unsupported font type");
++		bb_simple_error_msg_and_die("input file: bad length or unsupported font type");
+ 	}
+ 
+ #if !defined(PIO_FONTX) || defined(__sparc__)
+ 	if (fontsize != 256)
+-		bb_error_msg_and_die("only fontsize 256 supported");
++		bb_simple_error_msg_and_die("only fontsize 256 supported");
+ #endif
+ 
+ 	table = font + fontsize * charsize;
+ 	buffer += len;
+ 
+ 	if (table > buffer || (!has_table && table != buffer))
+-		bb_error_msg_and_die("input file: bad length");
++		bb_simple_error_msg_and_die("input file: bad length");
+ 
+ 	do_loadfont(fd, font, height, width, charsize, fontsize);
+ 
+@@ -361,7 +361,7 @@ int loadfont_main(int argc UNUSED_PARAM, char **argv)
+ 	buffer = xmalloc_read(STDIN_FILENO, &len);
+ 	// xmalloc_open_zipped_read_close(filename, &len);
+ 	if (!buffer)
+-		bb_perror_msg_and_die("error reading input font");
++		bb_simple_perror_msg_and_die("error reading input font");
+ 	do_load(get_console_fd_or_die(), buffer, len);
+ 
+ 	return EXIT_SUCCESS;
+@@ -502,7 +502,7 @@ int setfont_main(int argc UNUSED_PARAM, char **argv)
+ 				if (a < 0 || a >= E_TABSZ
+ 				 || b < 0 || b > 65535
+ 				) {
+-					bb_error_msg_and_die("map format");
++					bb_simple_error_msg_and_die("map format");
+ 				}
+ 				// patch map
+ 				unicodes[a] = b;
+diff --git a/console-tools/loadkmap.c b/console-tools/loadkmap.c
+index d4981ad21..91ef50884 100644
+--- a/console-tools/loadkmap.c
++++ b/console-tools/loadkmap.c
+@@ -69,7 +69,7 @@ int loadkmap_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	xread(STDIN_FILENO, flags, 7);
+ 	if (!is_prefixed_with(flags, BINARY_KEYMAP_MAGIC))
+-		bb_error_msg_and_die("not a valid binary keymap");
++		bb_simple_error_msg_and_die("not a valid binary keymap");
+ 
+ 	xread(STDIN_FILENO, flags, MAX_NR_KEYMAPS);
+ 
+diff --git a/console-tools/openvt.c b/console-tools/openvt.c
+index b01229a56..9e6cffecc 100644
+--- a/console-tools/openvt.c
++++ b/console-tools/openvt.c
+@@ -87,7 +87,7 @@ static int get_vt_fd(void)
+ 	fd = open(DEV_CONSOLE, O_RDONLY | O_NONBLOCK);
+ 	if (fd >= 0 && !not_vt_fd(fd))
+ 		return fd;
+-	bb_error_msg_and_die("can't find open VT");
++	bb_simple_error_msg_and_die("can't find open VT");
+ }
+ 
+ static int find_free_vtno(void)
+@@ -98,7 +98,7 @@ static int find_free_vtno(void)
+ 	errno = 0;
+ 	/*xfunc_error_retval = 3; - do we need compat? */
+ 	if (ioctl(fd, VT_OPENQRY, &vtno) != 0 || vtno <= 0)
+-		bb_perror_msg_and_die("can't find open VT");
++		bb_simple_perror_msg_and_die("can't find open VT");
+ // Not really needed, grep for DAEMON_CLOSE_EXTRA_FDS
+ //	if (fd > 2)
+ //		close(fd);
+diff --git a/console-tools/showkey.c b/console-tools/showkey.c
+index c322ce99d..8f0e9d938 100644
+--- a/console-tools/showkey.c
++++ b/console-tools/showkey.c
+@@ -56,7 +56,7 @@ static void xset1(struct termios *t)
+ {
+ 	int ret = tcsetattr(STDIN_FILENO, TCSAFLUSH, t);
+ 	if (ret) {
+-		bb_perror_msg("can't tcsetattr for stdin");
++		bb_simple_perror_msg("can't tcsetattr for stdin");
+ 	}
+ }
+ 
+diff --git a/coreutils/cp.c b/coreutils/cp.c
+index 59e3d2f80..cfeb19fc4 100644
+--- a/coreutils/cp.c
++++ b/coreutils/cp.c
+@@ -217,7 +217,7 @@ int cp_main(int argc, char **argv)
+ 		//	flags, FILEUTILS_RMDEST, OPT_parents);
+ 		if (flags & OPT_parents) {
+ 			if (!(d_flags & 2)) {
+-				bb_error_msg_and_die("with --parents, the destination must be a directory");
++				bb_simple_error_msg_and_die("with --parents, the destination must be a directory");
+ 			}
+ 		}
+ 		if (flags & FILEUTILS_RMDEST) {
+@@ -236,7 +236,7 @@ int cp_main(int argc, char **argv)
+ 			goto DO_COPY; /* NB: argc==2 -> *++argv==last */
+ 		}
+ 	} else if (flags & FILEUTILS_NO_TARGET_DIR) {
+-		bb_error_msg_and_die("too many arguments");
++		bb_simple_error_msg_and_die("too many arguments");
+ 	}
+ 
+ 	while (1) {
+diff --git a/coreutils/cut.c b/coreutils/cut.c
+index e952dc17b..1acbb513e 100644
+--- a/coreutils/cut.c
++++ b/coreutils/cut.c
+@@ -209,11 +209,11 @@ int cut_main(int argc UNUSED_PARAM, char **argv)
+ //	argc -= optind;
+ 	argv += optind;
+ 	if (!(opt & (CUT_OPT_BYTE_FLGS | CUT_OPT_CHAR_FLGS | CUT_OPT_FIELDS_FLGS)))
+-		bb_error_msg_and_die("expected a list of bytes, characters, or fields");
++		bb_simple_error_msg_and_die("expected a list of bytes, characters, or fields");
+ 
+ 	if (opt & CUT_OPT_DELIM_FLGS) {
+ 		if (ltok[0] && ltok[1]) { /* more than 1 char? */
+-			bb_error_msg_and_die("the delimiter must be a single character");
++			bb_simple_error_msg_and_die("the delimiter must be a single character");
+ 		}
+ 		delim = ltok[0];
+ 	}
+@@ -288,7 +288,7 @@ int cut_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 		/* make sure we got some cut positions out of all that */
+ 		if (nlists == 0)
+-			bb_error_msg_and_die("missing list of positions");
++			bb_simple_error_msg_and_die("missing list of positions");
+ 
+ 		/* now that the lists are parsed, we need to sort them to make life
+ 		 * easier on us when it comes time to print the chars / fields / lines
+diff --git a/coreutils/date.c b/coreutils/date.c
+index 3414d38ae..feb400430 100644
+--- a/coreutils/date.c
++++ b/coreutils/date.c
+@@ -304,7 +304,7 @@ int date_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 		/* if setting time, set it */
+ 		if ((opt & OPT_SET) && stime(&ts.tv_sec) < 0) {
+-			bb_perror_msg("can't set date");
++			bb_simple_perror_msg("can't set date");
+ 		}
+ 	}
+ 
+diff --git a/coreutils/df.c b/coreutils/df.c
+index f6d66e4b6..debb86867 100644
+--- a/coreutils/df.c
++++ b/coreutils/df.c
+@@ -178,7 +178,7 @@ int df_main(int argc UNUSED_PARAM, char **argv)
+ 	if (!argv[0]) {
+ 		mount_table = setmntent(bb_path_mtab_file, "r");
+ 		if (!mount_table)
+-			bb_perror_msg_and_die(bb_path_mtab_file);
++			bb_simple_perror_msg_and_die(bb_path_mtab_file);
+ 	}
+ 
+ 	while (1) {
+diff --git a/coreutils/echo.c b/coreutils/echo.c
+index 5dc5be072..b3828894c 100644
+--- a/coreutils/echo.c
++++ b/coreutils/echo.c
+@@ -188,7 +188,7 @@ int echo_main(int argc UNUSED_PARAM, char **argv)
+ 	/*r =*/ full_write(STDOUT_FILENO, buffer, out - buffer);
+ 	free(buffer);
+ 	if (/*WRONG:r < 0*/ errno) {
+-		bb_perror_msg(bb_msg_write_error);
++		bb_simple_perror_msg(bb_msg_write_error);
+ 		return 1;
+ 	}
+ 	return 0;
+diff --git a/coreutils/env.c b/coreutils/env.c
+index 878068f09..c37c0c2df 100644
+--- a/coreutils/env.c
++++ b/coreutils/env.c
+@@ -79,7 +79,7 @@ int env_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	while (*argv && (strchr(*argv, '=') != NULL)) {
+ 		if (putenv(*argv) < 0) {
+-			bb_perror_msg_and_die("putenv");
++			bb_simple_perror_msg_and_die("putenv");
+ 		}
+ 		++argv;
+ 	}
+diff --git a/coreutils/expand.c b/coreutils/expand.c
+index 20e4c4b23..4fa974df8 100644
+--- a/coreutils/expand.c
++++ b/coreutils/expand.c
+@@ -247,7 +247,7 @@ int expand_main(int argc UNUSED_PARAM, char **argv)
+ 	/* Now close stdin also */
+ 	/* (if we didn't read from it, it's a no-op) */
+ 	if (fclose(stdin))
+-		bb_perror_msg_and_die(bb_msg_standard_input);
++		bb_simple_perror_msg_and_die(bb_msg_standard_input);
+ 
+ 	fflush_stdout_and_exit(exit_status);
+ }
+diff --git a/coreutils/expr.c b/coreutils/expr.c
+index 1bdfba004..b247f08db 100644
+--- a/coreutils/expr.c
++++ b/coreutils/expr.c
+@@ -249,7 +249,7 @@ static arith_t arithmetic_common(VALUE *l, VALUE *r, int op)
+ 	arith_t li, ri;
+ 
+ 	if (!toarith(l) || !toarith(r))
+-		bb_error_msg_and_die("non-numeric argument");
++		bb_simple_error_msg_and_die("non-numeric argument");
+ 	li = l->u.i;
+ 	ri = r->u.i;
+ 	if (op == '+')
+@@ -259,7 +259,7 @@ static arith_t arithmetic_common(VALUE *l, VALUE *r, int op)
+ 	if (op == '*')
+ 		return li * ri;
+ 	if (ri == 0)
+-		bb_error_msg_and_die("division by zero");
++		bb_simple_error_msg_and_die("division by zero");
+ 	if (op == '/')
+ 		return li / ri;
+ 	return li % ri;
+@@ -319,19 +319,19 @@ static VALUE *eval7(void)
+ 	VALUE *v;
+ 
+ 	if (!*G.args)
+-		bb_error_msg_and_die("syntax error");
++		bb_simple_error_msg_and_die("syntax error");
+ 
+ 	if (nextarg("(")) {
+ 		G.args++;
+ 		v = eval();
+ 		if (!nextarg(")"))
+-			bb_error_msg_and_die("syntax error");
++			bb_simple_error_msg_and_die("syntax error");
+ 		G.args++;
+ 		return v;
+ 	}
+ 
+ 	if (nextarg(")"))
+-		bb_error_msg_and_die("syntax error");
++		bb_simple_error_msg_and_die("syntax error");
+ 
+ 	return str_value(*G.args++);
+ }
+@@ -353,7 +353,7 @@ static VALUE *eval6(void)
+ 	G.args++; /* We have a valid token, so get the next argument.  */
+ 	if (key == 1) { /* quote */
+ 		if (!*G.args)
+-			bb_error_msg_and_die("syntax error");
++			bb_simple_error_msg_and_die("syntax error");
+ 		return str_value(*G.args++);
+ 	}
+ 	if (key == 2) { /* length */
+@@ -546,11 +546,11 @@ int expr_main(int argc UNUSED_PARAM, char **argv)
+ 	xfunc_error_retval = 2; /* coreutils compat */
+ 	G.args = argv + 1;
+ 	if (*G.args == NULL) {
+-		bb_error_msg_and_die("too few arguments");
++		bb_simple_error_msg_and_die("too few arguments");
+ 	}
+ 	v = eval();
+ 	if (*G.args)
+-		bb_error_msg_and_die("syntax error");
++		bb_simple_error_msg_and_die("syntax error");
+ 	if (v->type == INTEGER)
+ 		printf("%" PF_REZ "d\n", PF_REZ_TYPE v->u.i);
+ 	else
+diff --git a/coreutils/id.c b/coreutils/id.c
+index 00c0cd8ab..f20cd7d09 100644
+--- a/coreutils/id.c
++++ b/coreutils/id.c
+@@ -231,7 +231,7 @@ int id_main(int argc UNUSED_PARAM, char **argv)
+ 			}
+ 		} else if (n < 0) { /* error in get_groups() */
+ 			if (ENABLE_DESKTOP)
+-				bb_error_msg_and_die("can't get groups");
++				bb_simple_error_msg_and_die("can't get groups");
+ 			return EXIT_FAILURE;
+ 		}
+ 		if (ENABLE_FEATURE_CLEAN_UP)
+diff --git a/coreutils/install.c b/coreutils/install.c
+index 8270490bd..c0f1c538a 100644
+--- a/coreutils/install.c
++++ b/coreutils/install.c
+@@ -238,7 +238,7 @@ int install_main(int argc, char **argv)
+ 				args[2] = dest;
+ 				args[3] = NULL;
+ 				if (spawn_and_wait(args)) {
+-					bb_perror_msg("strip");
++					bb_simple_perror_msg("strip");
+ 					ret = EXIT_FAILURE;
+ 				}
+ 			}
+diff --git a/coreutils/ln.c b/coreutils/ln.c
+index afeb0d72d..ea2d10eab 100644
+--- a/coreutils/ln.c
++++ b/coreutils/ln.c
+@@ -69,7 +69,7 @@ int ln_main(int argc, char **argv)
+ 	argc -= optind;
+ 
+ 	if ((opts & LN_LINKFILE) && argc > 2) {
+-		bb_error_msg_and_die("-T accepts 2 args max");
++		bb_simple_error_msg_and_die("-T accepts 2 args max");
+ 	}
+ 
+ 	if (!argv[1]) {
+diff --git a/coreutils/logname.c b/coreutils/logname.c
+index 31ce61f0c..06bbe1b0e 100644
+--- a/coreutils/logname.c
++++ b/coreutils/logname.c
+@@ -56,5 +56,5 @@ int logname_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
+ 		return fflush_all();
+ 	}
+ 
+-	bb_perror_msg_and_die("getlogin");
++	bb_simple_perror_msg_and_die("getlogin");
+ }
+diff --git a/coreutils/md5_sha1_sum.c b/coreutils/md5_sha1_sum.c
+index 538df251b..ba26c985a 100644
+--- a/coreutils/md5_sha1_sum.c
++++ b/coreutils/md5_sha1_sum.c
+@@ -300,7 +300,7 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv)
+ 				}
+ 				if (filename_ptr == NULL) {
+ 					if (flags & FLAG_WARN) {
+-						bb_error_msg("invalid format");
++						bb_simple_error_msg("invalid format");
+ 					}
+ 					count_failed++;
+ 					return_value = EXIT_FAILURE;
+diff --git a/coreutils/od_bloaty.c b/coreutils/od_bloaty.c
+index 4cae0c529..e9c071f3a 100644
+--- a/coreutils/od_bloaty.c
++++ b/coreutils/od_bloaty.c
+@@ -536,7 +536,7 @@ check_and_close(void)
+ 	}
+ 
+ 	if (ferror(stdout)) {
+-		bb_error_msg_and_die(bb_msg_write_error);
++		bb_simple_error_msg_and_die(bb_msg_write_error);
+ 	}
+ }
+ 
+@@ -841,7 +841,7 @@ skip(off_t n_skip)
+ 	}
+ 
+ 	if (n_skip)
+-		bb_error_msg_and_die("can't skip past end of combined input");
++		bb_simple_error_msg_and_die("can't skip past end of combined input");
+ }
+ 
+ 
+@@ -1308,10 +1308,10 @@ int od_main(int argc UNUSED_PARAM, char **argv)
+ 					pseudo_start = o2;
+ 					argv[1] = NULL;
+ 				} else {
+-					bb_error_msg_and_die("the last two arguments must be offsets");
++					bb_simple_error_msg_and_die("the last two arguments must be offsets");
+ 				}
+ 			} else { /* >3 args */
+-				bb_error_msg_and_die("too many arguments");
++				bb_simple_error_msg_and_die("too many arguments");
+ 			}
+ 
+ 			if (pseudo_start >= 0) {
+@@ -1332,7 +1332,7 @@ int od_main(int argc UNUSED_PARAM, char **argv)
+ 	if (option_mask32 & OPT_N) {
+ 		end_offset = n_bytes_to_skip + max_bytes_to_format;
+ 		if (end_offset < n_bytes_to_skip)
+-			bb_error_msg_and_die("SKIP + SIZE is too large");
++			bb_simple_error_msg_and_die("SKIP + SIZE is too large");
+ 	}
+ 
+ 	if (G.n_specs == 0) {
+@@ -1389,7 +1389,7 @@ int od_main(int argc UNUSED_PARAM, char **argv)
+ 		dump(n_bytes_to_skip, end_offset);
+ 
+ 	if (fclose(stdin))
+-		bb_perror_msg_and_die(bb_msg_standard_input);
++		bb_simple_perror_msg_and_die(bb_msg_standard_input);
+ 
+ 	return G.exit_code;
+ }
+diff --git a/coreutils/paste.c b/coreutils/paste.c
+index 3d81a5f1a..11743297a 100644
+--- a/coreutils/paste.c
++++ b/coreutils/paste.c
+@@ -116,7 +116,7 @@ int paste_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	if (opt & PASTE_OPT_DELIMITERS) {
+ 		if (!delims[0])
+-			bb_error_msg_and_die("-d '' is not supported");
++			bb_simple_error_msg_and_die("-d '' is not supported");
+ 		/* unknown mappings are not changed: "\z" -> '\\' 'z' */
+ 		/* trailing backslash, if any, is preserved */
+ 		del_cnt = strcpy_and_process_escape_sequences(delims, delims) - delims;
+diff --git a/coreutils/printf.c b/coreutils/printf.c
+index 5cf518699..a20fc3301 100644
+--- a/coreutils/printf.c
++++ b/coreutils/printf.c
+@@ -430,7 +430,7 @@ int printf_main(int argc UNUSED_PARAM, char **argv)
+ 		if (ENABLE_ASH_PRINTF
+ 		 && applet_name[0] != 'p'
+ 		) {
+-			bb_error_msg("usage: printf FORMAT [ARGUMENT...]");
++			bb_simple_error_msg("usage: printf FORMAT [ARGUMENT...]");
+ 			return 2; /* bash compat */
+ 		}
+ 		bb_show_usage();
+diff --git a/coreutils/rm.c b/coreutils/rm.c
+index fd94bb5c4..d000129d9 100644
+--- a/coreutils/rm.c
++++ b/coreutils/rm.c
+@@ -62,7 +62,7 @@ int rm_main(int argc UNUSED_PARAM, char **argv)
+ 			const char *base = bb_get_last_path_component_strip(*argv);
+ 
+ 			if (DOT_OR_DOTDOT(base)) {
+-				bb_error_msg("can't remove '.' or '..'");
++				bb_simple_error_msg("can't remove '.' or '..'");
+ 			} else if (remove_file(*argv, flags) >= 0) {
+ 				continue;
+ 			}
+diff --git a/coreutils/sort.c b/coreutils/sort.c
+index f04c6067b..07c327645 100644
+--- a/coreutils/sort.c
++++ b/coreutils/sort.c
+@@ -277,7 +277,7 @@ static int compare_keys(const void *xarg, const void *yarg)
+ 		/* Perform actual comparison */
+ 		switch (flags & (FLAG_n | FLAG_g | FLAG_M | FLAG_V)) {
+ 		default:
+-			bb_error_msg_and_die("unknown sort type");
++			bb_simple_error_msg_and_die("unknown sort type");
+ 			break;
+ #if defined(HAVE_STRVERSCMP) && HAVE_STRVERSCMP == 1
+ 		case FLAG_V:
+@@ -398,10 +398,10 @@ static unsigned str2u(char **str)
+ {
+ 	unsigned long lu;
+ 	if (!isdigit((*str)[0]))
+-		bb_error_msg_and_die("bad field specification");
++		bb_simple_error_msg_and_die("bad field specification");
+ 	lu = strtoul(*str, str, 10);
+ 	if ((sizeof(long) > sizeof(int) && lu > INT_MAX) || !lu)
+-		bb_error_msg_and_die("bad field specification");
++		bb_simple_error_msg_and_die("bad field specification");
+ 	return lu;
+ }
+ #endif
+@@ -461,7 +461,7 @@ int sort_main(int argc UNUSED_PARAM, char **argv)
+ #if ENABLE_FEATURE_SORT_BIG
+ 	if (opts & FLAG_t) {
+ 		if (!str_t[0] || str_t[1])
+-			bb_error_msg_and_die("bad -t parameter");
++			bb_simple_error_msg_and_die("bad -t parameter");
+ 		key_separator = str_t[0];
+ 	}
+ 	/* note: below this point we use option_mask32, not opts,
+@@ -504,10 +504,10 @@ int sort_main(int argc UNUSED_PARAM, char **argv)
+ 					because comma isn't in OPT_STR */
+ 				idx = strchr(OPT_STR, *str_k);
+ 				if (!idx)
+-					bb_error_msg_and_die("unknown key option");
++					bb_simple_error_msg_and_die("unknown key option");
+ 				flag = 1 << (idx - OPT_STR);
+ 				if (flag & ~FLAG_allowed_for_k)
+-					bb_error_msg_and_die("unknown sort type");
++					bb_simple_error_msg_and_die("unknown sort type");
+ 				/* b after ',' means strip _trailing_ space */
+ 				if (i && flag == FLAG_b)
+ 					flag = FLAG_bb;
+diff --git a/coreutils/split.c b/coreutils/split.c
+index c1e4ceab2..ecbc9d2d8 100644
+--- a/coreutils/split.c
++++ b/coreutils/split.c
+@@ -127,7 +127,7 @@ int split_main(int argc UNUSED_PARAM, char **argv)
+ 	}
+ 
+ 	if (NAME_MAX < strlen(sfx) + suffix_len)
+-		bb_error_msg_and_die("suffix too long");
++		bb_simple_error_msg_and_die("suffix too long");
+ 
+ 	{
+ 		char *char_p = xzalloc(suffix_len + 1);
+@@ -147,7 +147,7 @@ int split_main(int argc UNUSED_PARAM, char **argv)
+ 		do {
+ 			if (!remaining) {
+ 				if (!pfx)
+-					bb_error_msg_and_die("suffixes exhausted");
++					bb_simple_error_msg_and_die("suffixes exhausted");
+ 				xmove_fd(xopen(pfx, O_WRONLY | O_CREAT | O_TRUNC), 1);
+ 				pfx = next_file(pfx, suffix_len);
+ 				remaining = cnt;
+diff --git a/coreutils/stty.c b/coreutils/stty.c
+index d1309f9aa..40e812799 100644
+--- a/coreutils/stty.c
++++ b/coreutils/stty.c
+@@ -1320,7 +1320,7 @@ int stty_main(int argc UNUSED_PARAM, char **argv)
+ 					break;
+ 				case 'F':
+ 					if (file_name)
+-						bb_error_msg_and_die("only one device may be specified");
++						bb_simple_error_msg_and_die("only one device may be specified");
+ 					file_name = &arg[i+1]; /* "-Fdevice" ? */
+ 					if (!file_name[0]) { /* nope, "-F device" */
+ 						int p = k+1; /* argv[p] is argnext */
+@@ -1405,13 +1405,13 @@ int stty_main(int argc UNUSED_PARAM, char **argv)
+ 	if ((stty_state & (STTY_verbose_output | STTY_recoverable_output)) ==
+ 		(STTY_verbose_output | STTY_recoverable_output)
+ 	) {
+-		bb_error_msg_and_die("-a and -g are mutually exclusive");
++		bb_simple_error_msg_and_die("-a and -g are mutually exclusive");
+ 	}
+ 	/* Specifying -a or -g with non-options is an error */
+ 	if ((stty_state & (STTY_verbose_output | STTY_recoverable_output))
+ 	 && !(stty_state & STTY_noargs)
+ 	) {
+-		bb_error_msg_and_die("modes may not be set when -a or -g is used");
++		bb_simple_error_msg_and_die("modes may not be set when -a or -g is used");
+ 	}
+ 
+ 	/* Now it is safe to start doing things */
+diff --git a/coreutils/tail.c b/coreutils/tail.c
+index 14ed85d16..1f458f9ed 100644
+--- a/coreutils/tail.c
++++ b/coreutils/tail.c
+@@ -89,7 +89,7 @@ static ssize_t tail_read(int fd, char *buf, size_t count)
+ 
+ 	r = full_read(fd, buf, count);
+ 	if (r < 0) {
+-		bb_perror_msg(bb_msg_read_error);
++		bb_simple_perror_msg(bb_msg_read_error);
+ 		G.exitcode = EXIT_FAILURE;
+ 	}
+ 
+@@ -186,7 +186,7 @@ int tail_main(int argc, char **argv)
+ 	} while (++i < argc);
+ 
+ 	if (!nfiles)
+-		bb_error_msg_and_die("no files");
++		bb_simple_error_msg_and_die("no files");
+ 
+ 	/* prepare the buffer */
+ 	tailbufsize = BUFSIZ;
+diff --git a/coreutils/test.c b/coreutils/test.c
+index 8d7dac025..868ffbecb 100644
+--- a/coreutils/test.c
++++ b/coreutils/test.c
+@@ -832,12 +832,12 @@ int test_main(int argc, char **argv)
+ 		--argc;
+ 		if (!arg0[1]) { /* "[" ? */
+ 			if (NOT_LONE_CHAR(argv[argc], ']')) {
+-				bb_error_msg("missing ]");
++				bb_simple_error_msg("missing ]");
+ 				return 2;
+ 			}
+ 		} else { /* assuming "[[" */
+ 			if (strcmp(argv[argc], "]]") != 0) {
+-				bb_error_msg("missing ]]");
++				bb_simple_error_msg("missing ]]");
+ 				return 2;
+ 			}
+ 		}
+diff --git a/coreutils/tr.c b/coreutils/tr.c
+index ae35a9ee3..1e402dfdb 100644
+--- a/coreutils/tr.c
++++ b/coreutils/tr.c
+@@ -308,7 +308,7 @@ int tr_main(int argc UNUSED_PARAM, char **argv)
+ 		str1_length = complement(str1, str1_length);
+ 	if (*argv) {
+ 		if (argv[0][0] == '\0')
+-			bb_error_msg_and_die("STRING2 cannot be empty");
++			bb_simple_error_msg_and_die("STRING2 cannot be empty");
+ 		str2_length = expand(*argv, &str2);
+ 		map(vector, str1, str1_length,
+ 				str2, str2_length);
+@@ -333,7 +333,7 @@ int tr_main(int argc UNUSED_PARAM, char **argv)
+ 			read_chars = safe_read(STDIN_FILENO, str1, TR_BUFSIZ);
+ 			if (read_chars <= 0) {
+ 				if (read_chars < 0)
+-					bb_perror_msg_and_die(bb_msg_read_error);
++					bb_simple_perror_msg_and_die(bb_msg_read_error);
+ 				break;
+ 			}
+ 			in_index = 0;
+diff --git a/coreutils/uudecode.c b/coreutils/uudecode.c
+index 5f69e62b3..dc8ef5cca 100644
+--- a/coreutils/uudecode.c
++++ b/coreutils/uudecode.c
+@@ -82,7 +82,7 @@ static void FAST_FUNC read_stduu(FILE *src_stream, FILE *dst_stream, int flags U
+ 			continue;
+ 		}
+ 		if (encoded_len > 60) {
+-			bb_error_msg_and_die("line too long");
++			bb_simple_error_msg_and_die("line too long");
+ 		}
+ 
+ 		dst = line;
+@@ -108,7 +108,7 @@ static void FAST_FUNC read_stduu(FILE *src_stream, FILE *dst_stream, int flags U
+ 		fwrite(line, 1, dst - line, dst_stream);
+ 		free(line);
+ 	}
+-	bb_error_msg_and_die("short file");
++	bb_simple_error_msg_and_die("short file");
+ }
+ #endif
+ 
+@@ -166,7 +166,7 @@ int uudecode_main(int argc UNUSED_PARAM, char **argv)
+ 		/* fclose_if_not_stdin(src_stream); - redundant */
+ 		return EXIT_SUCCESS;
+ 	}
+-	bb_error_msg_and_die("no 'begin' line");
++	bb_simple_error_msg_and_die("no 'begin' line");
+ }
+ #endif
+ 
+@@ -216,7 +216,7 @@ int base64_main(int argc UNUSED_PARAM, char **argv)
+ 			if (!size)
+ 				break;
+ 			if ((ssize_t)size < 0)
+-				bb_perror_msg_and_die(bb_msg_read_error);
++				bb_simple_perror_msg_and_die(bb_msg_read_error);
+ 			/* Encode the buffer we just read in */
+ 			bb_uuencode(dst_buf, src_buf, size, bb_uuenc_tbl_base64);
+ 			xwrite(STDOUT_FILENO, dst_buf, 4 * ((size + 2) / 3));
+diff --git a/coreutils/uuencode.c b/coreutils/uuencode.c
+index 2807ef82a..db49ec80a 100644
+--- a/coreutils/uuencode.c
++++ b/coreutils/uuencode.c
+@@ -66,7 +66,7 @@ int uuencode_main(int argc UNUSED_PARAM, char **argv)
+ 		if (!size)
+ 			break;
+ 		if ((ssize_t)size < 0)
+-			bb_perror_msg_and_die(bb_msg_read_error);
++			bb_simple_perror_msg_and_die(bb_msg_read_error);
+ 		/* Encode the buffer we just read in */
+ 		bb_uuencode(dst_buf, src_buf, size, tbl);
+ 		bb_putchar('\n');
+diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c
+index 6fbf8b6de..68df44ae9 100644
+--- a/debianutils/start_stop_daemon.c
++++ b/debianutils/start_stop_daemon.c
+@@ -317,7 +317,7 @@ static void do_procinit(void)
+ 	}
+ 	closedir(procdir);
+ 	if (!pid)
+-		bb_error_msg_and_die("nothing in /proc - not mounted?");
++		bb_simple_error_msg_and_die("nothing in /proc - not mounted?");
+ }
+ 
+ static int do_stop(void)
+@@ -337,7 +337,7 @@ static int do_stop(void)
+ 	} else if (userspec) {
+ 		what = xasprintf("process(es) owned by '%s'", userspec);
+ 	} else {
+-		bb_error_msg_and_die("internal error, please report");
++		bb_simple_error_msg_and_die("internal error, please report");
+ 	}
+ 
+ 	if (!G.found_procs) {
+diff --git a/e2fsprogs/chattr.c b/e2fsprogs/chattr.c
+index c93e209b5..c37469021 100644
+--- a/e2fsprogs/chattr.c
++++ b/e2fsprogs/chattr.c
+@@ -196,11 +196,11 @@ int chattr_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	/* run sanity checks on all the arguments given us */
+ 	if ((g.flags & OPT_SET) && (g.flags & (OPT_ADD|OPT_REM)))
+-		bb_error_msg_and_die("= is incompatible with - and +");
++		bb_simple_error_msg_and_die("= is incompatible with - and +");
+ 	if (g.rf & g.af)
+-		bb_error_msg_and_die("can't set and unset a flag");
++		bb_simple_error_msg_and_die("can't set and unset a flag");
+ 	if (!g.flags)
+-		bb_error_msg_and_die("must use '-v', =, - or +");
++		bb_simple_error_msg_and_die("must use '-v', =, - or +");
+ 
+ 	/* now run chattr on all the files passed to us */
+ 	do change_attributes(*argv, &g); while (*++argv);
+diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c
+index 8a14b3bdc..fc53a9043 100644
+--- a/e2fsprogs/fsck.c
++++ b/e2fsprogs/fsck.c
+@@ -431,10 +431,10 @@ static int wait_one(int flags)
+ 			if (errno == EINTR)
+ 				continue;
+ 			if (errno == ECHILD) { /* paranoia */
+-				bb_error_msg("wait: no more children");
++				bb_simple_error_msg("wait: no more children");
+ 				return -1;
+ 			}
+-			bb_perror_msg("wait");
++			bb_simple_perror_msg("wait");
+ 			continue;
+ 		}
+ 		prev = NULL;
+@@ -919,7 +919,7 @@ static void compile_fs_type(char *fs_type)
+ 			if (G.fs_type_negated == -1)
+ 				G.fs_type_negated = negate;
+ 			if (G.fs_type_negated != negate)
+-				bb_error_msg_and_die(
++				bb_simple_error_msg_and_die(
+ "either all or none of the filesystem types passed to -t must be prefixed "
+ "with 'no' or '!'");
+ 		}
+diff --git a/editors/awk.c b/editors/awk.c
+index d25508e5d..f19990901 100644
+--- a/editors/awk.c
++++ b/editors/awk.c
+@@ -2633,7 +2633,7 @@ static var *evaluate(node *op, var *res)
+ 					if (opn == '|') {
+ 						rsm->F = popen(R.s, "w");
+ 						if (rsm->F == NULL)
+-							bb_perror_msg_and_die("popen");
++							bb_simple_perror_msg_and_die("popen");
+ 						rsm->is_pipe = 1;
+ 					} else {
+ 						rsm->F = xfopen(R.s, opn=='w' ? "w" : "a");
+@@ -3246,7 +3246,7 @@ int awk_main(int argc UNUSED_PARAM, char **argv)
+ 	argv += optind;
+ 	//argc -= optind;
+ 	if (opt & OPT_W)
+-		bb_error_msg("warning: option -W is ignored");
++		bb_simple_error_msg("warning: option -W is ignored");
+ 	if (opt & OPT_F) {
+ 		unescape_string_in_place(opt_F);
+ 		setvar_s(intvar[FS], opt_F);
+diff --git a/editors/diff.c b/editors/diff.c
+index 1462a9b18..dc40ab4f1 100644
+--- a/editors/diff.c
++++ b/editors/diff.c
+@@ -1006,7 +1006,7 @@ int diff_main(int argc UNUSED_PARAM, char **argv)
+ 	xfunc_error_retval = 1;
+ 
+ 	if (gotstdin && (S_ISDIR(stb[0].st_mode) || S_ISDIR(stb[1].st_mode)))
+-		bb_error_msg_and_die("can't compare stdin to a directory");
++		bb_simple_error_msg_and_die("can't compare stdin to a directory");
+ 
+ 	/* Compare metadata to check if the files are the same physical file.
+ 	 *
+@@ -1037,7 +1037,7 @@ int diff_main(int argc UNUSED_PARAM, char **argv)
+ #if ENABLE_FEATURE_DIFF_DIR
+ 		diffdir(file, s_start);
+ #else
+-		bb_error_msg_and_die("no support for directory comparison");
++		bb_simple_error_msg_and_die("no support for directory comparison");
+ #endif
+ 	} else {
+ 		bool dirfile = S_ISDIR(stb[0].st_mode) || S_ISDIR(stb[1].st_mode);
+diff --git a/editors/ed.c b/editors/ed.c
+index 1a36add39..d3ae8da92 100644
+--- a/editors/ed.c
++++ b/editors/ed.c
+@@ -165,7 +165,7 @@ static NOINLINE int searchLines(const char *str, int num1, int num2)
+ 
+ 	if (*str == '\0') {
+ 		if (searchString[0] == '\0') {
+-			bb_error_msg("no previous search string");
++			bb_simple_error_msg("no previous search string");
+ 			return 0;
+ 		}
+ 		str = searchString;
+@@ -228,7 +228,7 @@ static const char* getNum(const char *cp, smallint *retHaveNum, int *retNum)
+ 			case '\'':
+ 				cp++;
+ 				if ((unsigned)(*cp - 'a') >= 26) {
+-					bb_error_msg("bad mark name");
++					bb_simple_error_msg("bad mark name");
+ 					return NULL;
+ 				}
+ 				haveNum = TRUE;
+@@ -314,7 +314,7 @@ static int insertLine(int num, const char *data, int len)
+ 	LINE *newLp, *lp;
+ 
+ 	if ((num < 1) || (num > lastNum + 1)) {
+-		bb_error_msg("inserting at bad line number");
++		bb_simple_error_msg("inserting at bad line number");
+ 		return FALSE;
+ 	}
+ 
+@@ -384,7 +384,7 @@ static int readLines(const char *file, int num)
+ 	char *cp;
+ 
+ 	if ((num < 1) || (num > lastNum + 1)) {
+-		bb_error_msg("bad line for read");
++		bb_simple_error_msg("bad line for read");
+ 		return FALSE;
+ 	}
+ 
+@@ -629,7 +629,7 @@ static void subCommand(const char *cmd, int num1, int num2)
+ 	cp = buf;
+ 
+ 	if (isblank(*cp) || (*cp == '\0')) {
+-		bb_error_msg("bad delimiter for substitute");
++		bb_simple_error_msg("bad delimiter for substitute");
+ 		return;
+ 	}
+ 
+@@ -638,7 +638,7 @@ static void subCommand(const char *cmd, int num1, int num2)
+ 
+ 	cp = strchr(cp, delim);
+ 	if (cp == NULL) {
+-		bb_error_msg("missing 2nd delimiter for substitute");
++		bb_simple_error_msg("missing 2nd delimiter for substitute");
+ 		return;
+ 	}
+ 
+@@ -660,13 +660,13 @@ static void subCommand(const char *cmd, int num1, int num2)
+ 			printFlag = TRUE;
+ 			break;
+ 		default:
+-			bb_error_msg("unknown option for substitute");
++			bb_simple_error_msg("unknown option for substitute");
+ 			return;
+ 	}
+ 
+ 	if (*oldStr == '\0') {
+ 		if (searchString[0] == '\0') {
+-			bb_error_msg("no previous search string");
++			bb_simple_error_msg("no previous search string");
+ 			return;
+ 		}
+ 		oldStr = searchString;
+@@ -846,7 +846,7 @@ static void doCommands(void)
+ 
+ 		case 'f':
+ 			if (*cp != '\0' && *cp != ' ') {
+-				bb_error_msg("bad file command");
++				bb_simple_error_msg("bad file command");
+ 				break;
+ 			}
+ 			cp = skip_whitespace(cp);
+@@ -870,7 +870,7 @@ static void doCommands(void)
+ 		case 'k':
+ 			cp = skip_whitespace(cp);
+ 			if ((unsigned)(*cp - 'a') >= 26 || cp[1]) {
+-				bb_error_msg("bad mark name");
++				bb_simple_error_msg("bad mark name");
+ 				break;
+ 			}
+ 			marks[(unsigned)(*cp - 'a')] = num2;
+@@ -887,7 +887,7 @@ static void doCommands(void)
+ 		case 'q':
+ 			cp = skip_whitespace(cp);
+ 			if (have1 || *cp) {
+-				bb_error_msg("bad quit command");
++				bb_simple_error_msg("bad quit command");
+ 				break;
+ 			}
+ 			if (!dirty)
+@@ -903,12 +903,12 @@ static void doCommands(void)
+ 
+ 		case 'r':
+ 			if (*cp != '\0' && *cp != ' ') {
+-				bb_error_msg("bad read command");
++				bb_simple_error_msg("bad read command");
+ 				break;
+ 			}
+ 			cp = skip_whitespace(cp);
+ 			if (*cp == '\0') {
+-				bb_error_msg("no file name");
++				bb_simple_error_msg("no file name");
+ 				break;
+ 			}
+ 			if (!have1)
+@@ -925,14 +925,14 @@ static void doCommands(void)
+ 
+ 		case 'w':
+ 			if (*cp != '\0' && *cp != ' ') {
+-				bb_error_msg("bad write command");
++				bb_simple_error_msg("bad write command");
+ 				break;
+ 			}
+ 			cp = skip_whitespace(cp);
+ 			if (*cp == '\0') {
+ 				cp = fileName;
+ 				if (!cp) {
+-					bb_error_msg("no file name specified");
++					bb_simple_error_msg("no file name specified");
+ 					break;
+ 				}
+ 			}
+@@ -960,7 +960,7 @@ static void doCommands(void)
+ 
+ 		case '.':
+ 			if (have1) {
+-				bb_error_msg("no arguments allowed");
++				bb_simple_error_msg("no arguments allowed");
+ 				break;
+ 			}
+ 			printLines(curNum, curNum, FALSE);
+@@ -984,7 +984,7 @@ static void doCommands(void)
+ 			break;
+ 
+ 		default:
+-			bb_error_msg("unimplemented command");
++			bb_simple_error_msg("unimplemented command");
+ 			break;
+ 		}
+ 	}
+diff --git a/editors/patch_bbox.c b/editors/patch_bbox.c
+index 8e09ef488..d1f1ee2d6 100644
+--- a/editors/patch_bbox.c
++++ b/editors/patch_bbox.c
+@@ -30,7 +30,7 @@ static unsigned copy_lines(FILE *src_stream, FILE *dst_stream, unsigned lines_co
+ 			break;
+ 		}
+ 		if (fputs(line, dst_stream) == EOF) {
+-			bb_perror_msg_and_die("error writing to new file");
++			bb_simple_perror_msg_and_die("error writing to new file");
+ 		}
+ 		free(line);
+ 		lines_count--;
+@@ -148,7 +148,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 		new_filename = extract_filename(patch_line, patch_level, "+++ ");
+ 		if (!new_filename) {
+-			bb_error_msg_and_die("invalid patch");
++			bb_simple_error_msg_and_die("invalid patch");
+ 		}
+ 
+ 		/* Get access rights from the file to be patched */
+@@ -209,7 +209,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
+ 				/* src_beg_line will be 0 if it's a new file */
+ 				count = src_beg_line - src_cur_line;
+ 				if (copy_lines(src_stream, dst_stream, count)) {
+-					bb_error_msg_and_die("bad src file");
++					bb_simple_error_msg_and_die("bad src file");
+ 				}
+ 				src_cur_line += count;
+ 				dst_cur_line += count;
+diff --git a/editors/patch_toybox.c b/editors/patch_toybox.c
+index 3ffbf9084..aebab8132 100644
+--- a/editors/patch_toybox.c
++++ b/editors/patch_toybox.c
+@@ -200,7 +200,7 @@ int copy_tempfile(int fdin, char *name, char **tempname)
+ 
+ 	*tempname = xasprintf("%sXXXXXX", name);
+ 	fd = mkstemp(*tempname);
+-	if(-1 == fd) bb_perror_msg_and_die("no temp file");
++	if(-1 == fd) bb_simple_perror_msg_and_die("no temp file");
+ 
+ 	// Set permissions of output file
+ 	fstat(fdin, &statbuf);
+diff --git a/editors/sed.c b/editors/sed.c
+index 57d3dda16..d3444003e 100644
+--- a/editors/sed.c
++++ b/editors/sed.c
+@@ -315,7 +315,7 @@ static int parse_regex_delim(const char *cmdstr, char **match, char **replace)
+ 	/* verify that the 's' or 'y' is followed by something.  That something
+ 	 * (typically a 'slash') is now our regexp delimiter... */
+ 	if (*cmdstr == '\0')
+-		bb_error_msg_and_die("bad format in substitution expression");
++		bb_simple_error_msg_and_die("bad format in substitution expression");
+ 	delimiter = *cmdstr_ptr++;
+ 
+ 	/* save the match string */
+@@ -360,7 +360,7 @@ static int get_address(const char *my_str, int *linenum, regex_t ** regex)
+ 		} else {
+ 			*regex = G.previous_regex_ptr;
+ 			if (!G.previous_regex_ptr)
+-				bb_error_msg_and_die("no previous regexp");
++				bb_simple_error_msg_and_die("no previous regexp");
+ 		}
+ 		/* Move position to next character after last delimiter */
+ 		pos += (next+1);
+@@ -378,7 +378,7 @@ static int parse_file_cmd(/*sed_cmd_t *sed_cmd,*/ const char *filecmdstr, char *
+ 	start = skip_whitespace(filecmdstr);
+ 	eol = strchrnul(start, '\n');
+ 	if (eol == start)
+-		bb_error_msg_and_die("empty filename");
++		bb_simple_error_msg_and_die("empty filename");
+ 
+ 	if (*eol) {
+ 		/* If lines glued together, put backslash back. */
+@@ -468,7 +468,7 @@ static int parse_subst_cmd(sed_cmd_t *sed_cmd, const char *substr)
+ 			goto out;
+ 		default:
+ 			dbg("s bad flags:'%s'", substr + idx);
+-			bb_error_msg_and_die("bad option in substitution expression");
++			bb_simple_error_msg_and_die("bad option in substitution expression");
+ 		}
+ 	}
+  out:
+@@ -688,7 +688,7 @@ static void add_cmd(const char *cmdstr)
+ 				idx--; /* if 0, trigger error check below */
+ 			}
+ 			if (idx < 0)
+-				bb_error_msg_and_die("no address after comma");
++				bb_simple_error_msg_and_die("no address after comma");
+ 			sed_cmd->end_line_orig = sed_cmd->end_line;
+ 		}
+ 
+@@ -706,7 +706,7 @@ static void add_cmd(const char *cmdstr)
+ 
+ 		/* last part (mandatory) will be a command */
+ 		if (!*cmdstr)
+-			bb_error_msg_and_die("missing command");
++			bb_simple_error_msg_and_die("missing command");
+ 		sed_cmd->cmd = *cmdstr++;
+ 		cmdstr = parse_cmd_args(sed_cmd, cmdstr);
+ 
+@@ -791,7 +791,7 @@ static int do_subst_command(sed_cmd_t *sed_cmd, char **line_p)
+ 	if (!current_regex) {
+ 		current_regex = G.previous_regex_ptr;
+ 		if (!current_regex)
+-			bb_error_msg_and_die("no previous regexp");
++			bb_simple_error_msg_and_die("no previous regexp");
+ 	}
+ 	G.previous_regex_ptr = current_regex;
+ 
+@@ -962,7 +962,7 @@ static void puts_maybe_newline(char *s, FILE *file, char *last_puts_char, char l
+ 
+ 	if (ferror(file)) {
+ 		xfunc_error_retval = 4;  /* It's what gnu sed exits with... */
+-		bb_error_msg_and_die(bb_msg_write_error);
++		bb_simple_error_msg_and_die(bb_msg_write_error);
+ 	}
+ 	*last_puts_char = lpc;
+ }
+@@ -1192,7 +1192,7 @@ static void process_files(void)
+ 					}
+ 					sed_cmd = sed_cmd->next;
+ 					if (!sed_cmd)
+-						bb_error_msg_and_die("unterminated {");
++						bb_simple_error_msg_and_die("unterminated {");
+ 				}
+ 			}
+ 			continue;
+diff --git a/editors/vi.c b/editors/vi.c
+index 0ea547a75..f8fab7028 100644
+--- a/editors/vi.c
++++ b/editors/vi.c
+@@ -1042,7 +1042,7 @@ static int readit(void) // read (maybe cursor) key from stdin
+ 			goto again;
+ 		go_bottom_and_clear_to_eol();
+ 		cookmode(); // terminal to "cooked"
+-		bb_error_msg_and_die("can't read user input");
++		bb_simple_error_msg_and_die("can't read user input");
+ 	}
+ 	return c;
+ }
+diff --git a/findutils/find.c b/findutils/find.c
+index 06ad1b39c..d6679bd08 100644
+--- a/findutils/find.c
++++ b/findutils/find.c
+@@ -1245,7 +1245,7 @@ static action*** parse_params(char **argv)
+ 			 * coreutils expects {} to appear only once in "-exec +"
+ 			 */
+ 			if (all_subst != 1 && ap->filelist)
+-				bb_error_msg_and_die("only one '{}' allowed for -exec +");
++				bb_simple_error_msg_and_die("only one '{}' allowed for -exec +");
+ # endif
+ 		}
+ #endif
+@@ -1259,7 +1259,7 @@ static action*** parse_params(char **argv)
+ 			endarg = argv;
+ 			while (1) {
+ 				if (!*++endarg)
+-					bb_error_msg_and_die("unpaired '('");
++					bb_simple_error_msg_and_die("unpaired '('");
+ 				if (LONE_CHAR(*endarg, '('))
+ 					nested++;
+ 				else if (LONE_CHAR(*endarg, ')') && !--nested) {
+diff --git a/findutils/xargs.c b/findutils/xargs.c
+index 03eafd616..726315803 100644
+--- a/findutils/xargs.c
++++ b/findutils/xargs.c
+@@ -665,7 +665,7 @@ int xargs_main(int argc UNUSED_PARAM, char **argv)
+ 	}
+ 	/* Sanity check */
+ 	if (n_max_chars <= 0) {
+-		bb_error_msg_and_die("can't fit single argument within argument list size limit");
++		bb_simple_error_msg_and_die("can't fit single argument within argument list size limit");
+ 	}
+ 
+ 	buf = xzalloc(n_max_chars + 1);
+@@ -716,7 +716,7 @@ int xargs_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 		if (!G.args[initial_idx]) { /* not even one ARG was added? */
+ 			if (*rem != '\0')
+-				bb_error_msg_and_die("argument line too long");
++				bb_simple_error_msg_and_die("argument line too long");
+ 			if (opt & OPT_NO_EMPTY)
+ 				break;
+ 		}
+diff --git a/include/libbb.h b/include/libbb.h
+index 021100db1..111d1b790 100644
+--- a/include/libbb.h
++++ b/include/libbb.h
+@@ -1137,7 +1137,7 @@ void exec_prog_or_SHELL(char **argv) NORETURN FAST_FUNC;
+ ({ \
+ 	pid_t bb__xvfork_pid = vfork(); \
+ 	if (bb__xvfork_pid < 0) \
+-		bb_perror_msg_and_die("vfork"); \
++		bb_simple_perror_msg_and_die("vfork"); \
+ 	bb__xvfork_pid; \
+ })
+ #if BB_MMU
+@@ -1324,13 +1324,17 @@ extern void (*die_func)(void);
+ void xfunc_die(void) NORETURN FAST_FUNC;
+ void bb_show_usage(void) NORETURN FAST_FUNC;
+ void bb_error_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC;
++void bb_simple_error_msg(const char *s) FAST_FUNC;
+ void bb_error_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))) FAST_FUNC;
++void bb_simple_error_msg_and_die(const char *s) NORETURN FAST_FUNC;
+ void bb_perror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC;
+ void bb_simple_perror_msg(const char *s) FAST_FUNC;
+ void bb_perror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))) FAST_FUNC;
+ void bb_simple_perror_msg_and_die(const char *s) NORETURN FAST_FUNC;
+ void bb_herror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC;
++void bb_simple_herror_msg(const char *s) FAST_FUNC;
+ void bb_herror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))) FAST_FUNC;
++void bb_simple_herror_msg_and_die(const char *s) NORETURN FAST_FUNC;
+ void bb_perror_nomsg_and_die(void) NORETURN FAST_FUNC;
+ void bb_perror_nomsg(void) FAST_FUNC;
+ void bb_verror_msg(const char *s, va_list p, const char *strerr) FAST_FUNC;
+@@ -1339,12 +1343,51 @@ void bb_logenv_override(void) FAST_FUNC;
+ 
+ #if ENABLE_FEATURE_SYSLOG_INFO
+ void bb_info_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC;
++void bb_simple_info_msg(const char *s) FAST_FUNC;
+ void bb_vinfo_msg(const char *s, va_list p) FAST_FUNC;
+ #else
+ #define bb_info_msg bb_error_msg
++#define bb_simple_info_msg bb_simple_error_msg
+ #define bb_vinfo_msg(s,p) bb_verror_msg(s,p,NULL)
+ #endif
+ 
++#if ENABLE_WARN_SIMPLE_MSG
++/* If enabled, cause calls to bb_error_msg() et al that only take a single
++ * parameter to generate a warning.
++ */
++static inline void __attribute__ ((deprecated("use bb_simple_error_msg instead")))
++	bb_not_simple_error_msg(const char *s) { bb_simple_error_msg(s); }
++static inline void __attribute__ ((deprecated("use bb_simple_error_msg_and_die instead"))) NORETURN
++	bb_not_simple_error_msg_and_die(const char *s) { bb_simple_error_msg_and_die(s); }
++static inline void __attribute__ ((deprecated("use bb_simple_perror_msg instead")))
++	bb_not_simple_perror_msg(const char *s) { bb_simple_perror_msg(s); }
++static inline void __attribute__ ((deprecated("use bb_simple_perror_msg_and_die instead"))) NORETURN
++	bb_not_simple_perror_msg_and_die(const char *s) { bb_simple_perror_msg_and_die(s); }
++static inline void __attribute__ ((deprecated("use bb_simple_herror_msg instead")))
++	bb_not_simple_herror_msg(const char *s) { bb_simple_herror_msg(s); }
++static inline void __attribute__ ((deprecated("use bb_simple_herror_msg_and_die instead"))) NORETURN
++	bb_not_simple_herror_msg_and_die(const char *s) { bb_simple_herror_msg_and_die(s); }
++static inline void __attribute__ ((deprecated("use bb_simple_info_msg instead")))
++	bb_not_simple_info_msg(const char *s) { bb_simple_info_msg(s); }
++/* Override bb_error_msg() and related functions with macros that will
++ * substitute them for the equivalent bb_not_simple_error_msg() function when
++ * they are used with only a single parameter. Macro approach inspired by
++ * https://gustedt.wordpress.com/2010/06/08/detect-empty-macro-arguments and
++ * https://gustedt.wordpress.com/2010/06/03/default-arguments-for-c99
++ */
++#define _ARG18(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, ...) _17
++#define BB_MSG_KIND(...)           _ARG18(__VA_ARGS__, , , , , , , , , , , , , , , , , _not_simple)
++#define _BB_MSG(name, kind, ...)   bb##kind##name(__VA_ARGS__)
++#define BB_MSG(name, kind, ...)    _BB_MSG(name, kind, __VA_ARGS__)
++#define bb_error_msg(...)          BB_MSG(_error_msg, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
++#define bb_error_msg_and_die(...)  BB_MSG(_error_msg_and_die, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
++#define bb_perror_msg(...)         BB_MSG(_perror_msg, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
++#define bb_perror_msg_and_die(...) BB_MSG(_perror_msg_and_die, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
++#define bb_herror_msg(...)         BB_MSG(_herror_msg, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
++#define bb_herror_msg_and_die(...) BB_MSG(_herror_msg_and_die, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
++#define bb_info_msg(...)           BB_MSG(_info_msg, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
++#endif
++
+ /* We need to export XXX_main from libbusybox
+  * only if we build "individual" binaries
+  */
+diff --git a/init/bootchartd.c b/init/bootchartd.c
+index 4377d90e3..750f67356 100644
+--- a/init/bootchartd.c
++++ b/init/bootchartd.c
+@@ -208,7 +208,7 @@ static char *make_tempdir(void)
+ 			bb_perror_msg_and_die("can't %smount tmpfs", "un");
+ 		}
+ #else
+-		bb_perror_msg_and_die("can't create temporary directory");
++		bb_simple_perror_msg_and_die("can't create temporary directory");
+ #endif
+ 	} else {
+ 		xchdir(tempdir);
+diff --git a/init/init.c b/init/init.c
+index 87086b48b..0f3c5fa4d 100644
+--- a/init/init.c
++++ b/init/init.c
+@@ -1086,7 +1086,7 @@ int init_main(int argc UNUSED_PARAM, char **argv)
+ 		if (getpid() != 1
+ 		 && (!ENABLE_LINUXRC || applet_name[0] != 'l') /* not linuxrc? */
+ 		) {
+-			bb_error_msg_and_die("must be run as PID 1");
++			bb_simple_error_msg_and_die("must be run as PID 1");
+ 		}
+ #ifdef RB_DISABLE_CAD
+ 		/* Turn off rebooting via CTL-ALT-DEL - we get a
+diff --git a/libbb/appletlib.c b/libbb/appletlib.c
+index fa19e8488..9fa17cfa1 100644
+--- a/libbb/appletlib.c
++++ b/libbb/appletlib.c
+@@ -631,7 +631,7 @@ static void check_suid(int applet_no)
+ 			/* same group / in group */
+ 			m >>= 3;
+ 		if (!(m & S_IXOTH)) /* is x bit not set? */
+-			bb_error_msg_and_die("you have no permission to run this applet");
++			bb_simple_error_msg_and_die("you have no permission to run this applet");
+ 
+ 		/* We set effective AND saved ids. If saved-id is not set
+ 		 * like we do below, seteuid(0) can still later succeed! */
+@@ -643,7 +643,7 @@ static void check_suid(int applet_no)
+ 			rgid = sct->m_ugid.gid;
+ 		/* else: we will set egid = rgid, thus dropping sgid effect */
+ 		if (setresgid(-1, rgid, rgid))
+-			bb_perror_msg_and_die("setresgid");
++			bb_simple_perror_msg_and_die("setresgid");
+ 
+ 		/* Are we directed to change uid
+ 		 * (APPLET = s** USER.GROUP or APPLET = S** USER.GROUP)?
+@@ -653,7 +653,7 @@ static void check_suid(int applet_no)
+ 			uid = sct->m_ugid.uid;
+ 		/* else: we will set euid = ruid, thus dropping suid effect */
+ 		if (setresuid(-1, uid, uid))
+-			bb_perror_msg_and_die("setresuid");
++			bb_simple_perror_msg_and_die("setresuid");
+ 
+ 		goto ret;
+ 	}
+@@ -663,7 +663,7 @@ static void check_suid(int applet_no)
+ 
+ 		if (!onetime) {
+ 			onetime = 1;
+-			bb_error_msg("using fallback suid method");
++			bb_simple_error_msg("using fallback suid method");
+ 		}
+ 	}
+ #   endif
+@@ -673,7 +673,7 @@ static void check_suid(int applet_no)
+ 		/* Real uid is not 0. If euid isn't 0 too, suid bit
+ 		 * is most probably not set on our executable */
+ 		if (geteuid())
+-			bb_error_msg_and_die("must be suid to work properly");
++			bb_simple_error_msg_and_die("must be suid to work properly");
+ 	} else if (APPLET_SUID(applet_no) == BB_SUID_DROP) {
+ 		/*
+ 		 * Drop all privileges.
+diff --git a/libbb/bb_getgroups.c b/libbb/bb_getgroups.c
+index 59ae53738..5d83c729a 100644
+--- a/libbb/bb_getgroups.c
++++ b/libbb/bb_getgroups.c
+@@ -38,7 +38,7 @@ gid_t* FAST_FUNC bb_getgroups(int *ngroups, gid_t *group_array)
+ 			continue;
+ 		}
+ 		/* Some other error (should never happen on Linux) */
+-		bb_perror_msg_and_die("getgroups");
++		bb_simple_perror_msg_and_die("getgroups");
+ 	}
+ 
+ 	if (ngroups)
+diff --git a/libbb/bbunit.c b/libbb/bbunit.c
+index 5f8d980a3..ccd909d78 100644
+--- a/libbb/bbunit.c
++++ b/libbb/bbunit.c
+@@ -60,6 +60,6 @@ int unit_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
+ 		return EXIT_FAILURE;
+ 	}
+ 
+-	bb_error_msg("All tests passed");
++	bb_simple_error_msg("All tests passed");
+ 	return EXIT_SUCCESS;
+ }
+diff --git a/libbb/capability.c b/libbb/capability.c
+index d0ae78b91..23afd8eb9 100644
+--- a/libbb/capability.c
++++ b/libbb/capability.c
+@@ -119,7 +119,7 @@ void FAST_FUNC getcaps(void *arg)
+ 			caps->u32s = _LINUX_CAPABILITY_U32S_3;
+ 			break;
+ 		default:
+-			bb_error_msg_and_die("unsupported capability version");
++			bb_simple_error_msg_and_die("unsupported capability version");
+ 	}
+ 
+ 	if (capget(&caps->header, caps->data) != 0)
+diff --git a/libbb/change_identity.c b/libbb/change_identity.c
+index 20d7c5f2d..9ff741234 100644
+--- a/libbb/change_identity.c
++++ b/libbb/change_identity.c
+@@ -51,7 +51,7 @@ void FAST_FUNC change_identity(const struct passwd *pw)
+ 			return;
+ 		}
+ 
+-		bb_perror_msg_and_die("can't set groups");
++		bb_simple_perror_msg_and_die("can't set groups");
+ 	}
+ 
+ 	xsetgid(pw->pw_gid);
+diff --git a/libbb/copy_file.c b/libbb/copy_file.c
+index 2d6557cd4..49d1ec9c6 100644
+--- a/libbb/copy_file.c
++++ b/libbb/copy_file.c
+@@ -327,7 +327,7 @@ int FAST_FUNC copy_file(const char *source, const char *dest, int flags)
+ 		) {
+ 			security_context_t con;
+ 			if (getfscreatecon(&con) == -1) {
+-				bb_perror_msg("getfscreatecon");
++				bb_simple_perror_msg("getfscreatecon");
+ 				return -1;
+ 			}
+ 			if (con) {
+diff --git a/libbb/copyfd.c b/libbb/copyfd.c
+index dd0517cd6..ae5c26999 100644
+--- a/libbb/copyfd.c
++++ b/libbb/copyfd.c
+@@ -87,7 +87,7 @@ static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size)
+ 		rd = safe_read(src_fd, buffer,
+ 			size > buffer_size ? buffer_size : size);
+ 		if (rd < 0) {
+-			bb_perror_msg(bb_msg_read_error);
++			bb_simple_perror_msg(bb_msg_read_error);
+ 			break;
+ 		}
+  read_ok:
+@@ -100,7 +100,7 @@ static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size)
+ 			ssize_t wr = full_write(dst_fd, buffer, rd);
+ 			if (wr < rd) {
+ 				if (!continue_on_write_error) {
+-					bb_perror_msg(bb_msg_write_error);
++					bb_simple_perror_msg(bb_msg_write_error);
+ 					break;
+ 				}
+ 				dst_fd = -1;
+@@ -151,7 +151,7 @@ void FAST_FUNC bb_copyfd_exact_size(int fd1, int fd2, off_t size)
+ 	if (sz == (size >= 0 ? size : -size))
+ 		return;
+ 	if (sz != -1)
+-		bb_error_msg_and_die("short read");
++		bb_simple_error_msg_and_die("short read");
+ 	/* if sz == -1, bb_copyfd_XX already complained */
+ 	xfunc_die();
+ }
+diff --git a/libbb/die_if_bad_username.c b/libbb/die_if_bad_username.c
+index 46f103340..e5e1160c4 100644
+--- a/libbb/die_if_bad_username.c
++++ b/libbb/die_if_bad_username.c
+@@ -57,5 +57,5 @@ void FAST_FUNC die_if_bad_username(const char *name)
+ 	 * including the terminating null byte.
+ 	 */
+ 	if (name - start >= LOGIN_NAME_MAX)
+-		bb_error_msg_and_die("name is too long");
++		bb_simple_error_msg_and_die("name is too long");
+ }
+diff --git a/libbb/dump.c b/libbb/dump.c
+index b4b49d709..8029cca0e 100644
+--- a/libbb/dump.c
++++ b/libbb/dump.c
+@@ -199,7 +199,7 @@ static NOINLINE void rewrite(priv_dumper_t *dumper, FS *fs)
+ 				pr->bcnt = fu->bcnt;
+ 				if (fu->bcnt == 0) {
+ 					if (!prec)
+-						bb_error_msg_and_die("%%s needs precision or byte count");
++						bb_simple_error_msg_and_die("%%s needs precision or byte count");
+ 					pr->bcnt = atoi(prec);
+ 				}
+ 			} else
+@@ -266,7 +266,7 @@ static NOINLINE void rewrite(priv_dumper_t *dumper, FS *fs)
+ 
+ 			/* only one conversion character if byte count */
+ 			if (!(pr->flags & F_ADDRESS) && fu->bcnt && nconv++) {
+-				bb_error_msg_and_die("byte count with multiple conversion characters");
++				bb_simple_error_msg_and_die("byte count with multiple conversion characters");
+ 			}
+ 		}
+ 		/*
+diff --git a/libbb/fflush_stdout_and_exit.c b/libbb/fflush_stdout_and_exit.c
+index 4c689c0fb..5df74170e 100644
+--- a/libbb/fflush_stdout_and_exit.c
++++ b/libbb/fflush_stdout_and_exit.c
+@@ -15,7 +15,7 @@ void FAST_FUNC fflush_stdout_and_exit(int retval)
+ {
+ 	xfunc_error_retval = retval;
+ 	if (fflush(stdout))
+-		bb_perror_msg_and_die(bb_msg_standard_output);
++		bb_simple_perror_msg_and_die(bb_msg_standard_output);
+ 	/* In case we are in NOFORK applet. Do not exit() directly,
+ 	 * but use xfunc_die() */
+ 	xfunc_die();
+diff --git a/libbb/get_console.c b/libbb/get_console.c
+index 0b53524aa..7f2c75332 100644
+--- a/libbb/get_console.c
++++ b/libbb/get_console.c
+@@ -62,7 +62,7 @@ int FAST_FUNC get_console_fd_or_die(void)
+ 		}
+ 	}
+ 
+-	bb_error_msg_and_die("can't open console");
++	bb_simple_error_msg_and_die("can't open console");
+ }
+ 
+ /* From <linux/vt.h> */
+diff --git a/libbb/get_volsize.c b/libbb/get_volsize.c
+index 241ceda9b..087efb3c7 100644
+--- a/libbb/get_volsize.c
++++ b/libbb/get_volsize.c
+@@ -18,7 +18,7 @@ uoff_t FAST_FUNC get_volume_size_in_bytes(int fd,
+ 	if (override) {
+ 		result = XATOOFF(override);
+ 		if (result >= (uoff_t)(MAXINT(off_t)) / override_units)
+-			bb_error_msg_and_die("image size is too big");
++			bb_simple_error_msg_and_die("image size is too big");
+ 		result *= override_units;
+ 		/* seek past end fails on block devices but works on files */
+ 		if (lseek(fd, result - 1, SEEK_SET) != (off_t)-1) {
+@@ -42,7 +42,7 @@ uoff_t FAST_FUNC get_volume_size_in_bytes(int fd,
+ 	 *
+ 	 * Picked 16k arbitrarily: */
+ 	if (result < 16*1024)
+-		bb_error_msg_and_die("image is too small");
++		bb_simple_error_msg_and_die("image is too small");
+ 
+ 	return result;
+ }
+diff --git a/libbb/getpty.c b/libbb/getpty.c
+index 5d24ca930..9ec6265ad 100644
+--- a/libbb/getpty.c
++++ b/libbb/getpty.c
+@@ -23,14 +23,14 @@ int FAST_FUNC xgetpty(char *line)
+ 			const char *name;
+ 			name = ptsname(p); /* find out the name of slave pty */
+ 			if (!name) {
+-				bb_perror_msg_and_die("ptsname error (is /dev/pts mounted?)");
++				bb_simple_perror_msg_and_die("ptsname error (is /dev/pts mounted?)");
+ 			}
+ 			safe_strncpy(line, name, GETPTY_BUFSIZE);
+ 		}
+ # else
+ 		/* find out the name of slave pty */
+ 		if (ptsname_r(p, line, GETPTY_BUFSIZE-1) != 0) {
+-			bb_perror_msg_and_die("ptsname error (is /dev/pts mounted?)");
++			bb_simple_perror_msg_and_die("ptsname error (is /dev/pts mounted?)");
+ 		}
+ 		line[GETPTY_BUFSIZE-1] = '\0';
+ # endif
+@@ -61,5 +61,5 @@ int FAST_FUNC xgetpty(char *line)
+ 		}
+ 	}
+ #endif /* FEATURE_DEVPTS */
+-	bb_error_msg_and_die("can't find free pty");
++	bb_simple_error_msg_and_die("can't find free pty");
+ }
+diff --git a/libbb/herror_msg.c b/libbb/herror_msg.c
+index d041076e0..a7dd98679 100644
+--- a/libbb/herror_msg.c
++++ b/libbb/herror_msg.c
+@@ -26,3 +26,13 @@ void FAST_FUNC bb_herror_msg_and_die(const char *s, ...)
+ 	va_end(p);
+ 	xfunc_die();
+ }
++
++void FAST_FUNC bb_simple_herror_msg(const char *s)
++{
++	bb_herror_msg("%s", s);
++}
++
++void FAST_FUNC bb_simple_herror_msg_and_die(const char *s)
++{
++	bb_herror_msg_and_die("%s", s);
++}
+diff --git a/libbb/mtab.c b/libbb/mtab.c
+index 131705ddb..aa1a2a103 100644
+--- a/libbb/mtab.c
++++ b/libbb/mtab.c
+@@ -21,7 +21,7 @@ void FAST_FUNC erase_mtab(const char *name)
+ 	/* Bummer. Fall back on trying the /proc filesystem */
+ 	if (!mountTable) mountTable = setmntent("/proc/mounts", "r");
+ 	if (!mountTable) {
+-		bb_perror_msg(bb_path_mtab_file);
++		bb_simple_perror_msg(bb_path_mtab_file);
+ 		return;
+ 	}
+ 
+@@ -49,6 +49,6 @@ void FAST_FUNC erase_mtab(const char *name)
+ 		}
+ 		endmntent(mountTable);
+ 	} else if (errno != EROFS)
+-		bb_perror_msg(bb_path_mtab_file);
++		bb_simple_perror_msg(bb_path_mtab_file);
+ }
+ #endif
+diff --git a/libbb/perror_nomsg.c b/libbb/perror_nomsg.c
+index a2a11cc8e..d7d53de44 100644
+--- a/libbb/perror_nomsg.c
++++ b/libbb/perror_nomsg.c
+@@ -12,11 +12,11 @@
+  * instead of including libbb.h */
+ //#include "libbb.h"
+ #include "platform.h"
+-extern void bb_perror_msg(const char *s, ...) FAST_FUNC;
++extern void bb_simple_perror_msg(const char *s) FAST_FUNC;
+ 
+ /* suppress gcc "no previous prototype" warning */
+ void FAST_FUNC bb_perror_nomsg(void);
+ void FAST_FUNC bb_perror_nomsg(void)
+ {
+-	bb_perror_msg(0);
++	bb_simple_perror_msg(0);
+ }
+diff --git a/libbb/perror_nomsg_and_die.c b/libbb/perror_nomsg_and_die.c
+index 543ff5178..bea5f25a5 100644
+--- a/libbb/perror_nomsg_and_die.c
++++ b/libbb/perror_nomsg_and_die.c
+@@ -12,11 +12,11 @@
+  * instead of including libbb.h */
+ //#include "libbb.h"
+ #include "platform.h"
+-extern void bb_perror_msg_and_die(const char *s, ...) FAST_FUNC;
++extern void bb_simple_perror_msg_and_die(const char *s) FAST_FUNC;
+ 
+ /* suppress gcc "no previous prototype" warning */
+ void FAST_FUNC bb_perror_nomsg_and_die(void);
+ void FAST_FUNC bb_perror_nomsg_and_die(void)
+ {
+-	bb_perror_msg_and_die(0);
++	bb_simple_perror_msg_and_die(0);
+ }
+diff --git a/libbb/read_printf.c b/libbb/read_printf.c
+index cb582c080..0cd04ab7b 100644
+--- a/libbb/read_printf.c
++++ b/libbb/read_printf.c
+@@ -217,7 +217,7 @@ void FAST_FUNC xread(int fd, void *buf, size_t count)
+ 	if (count) {
+ 		ssize_t size = full_read(fd, buf, count);
+ 		if ((size_t)size != count)
+-			bb_error_msg_and_die("short read");
++			bb_simple_error_msg_and_die("short read");
+ 	}
+ }
+ 
+diff --git a/libbb/safe_poll.c b/libbb/safe_poll.c
+index cf93a9774..a07e785f3 100644
+--- a/libbb/safe_poll.c
++++ b/libbb/safe_poll.c
+@@ -27,7 +27,7 @@ int FAST_FUNC safe_poll(struct pollfd *ufds, nfds_t nfds, int timeout)
+ 		/* I doubt many callers would handle this correctly! */
+ 		if (errno == ENOMEM)
+ 			continue;
+-		bb_perror_msg("poll");
++		bb_simple_perror_msg("poll");
+ 		return n;
+ 	}
+ }
+diff --git a/libbb/selinux_common.c b/libbb/selinux_common.c
+index c2585557f..f917a1c6a 100644
+--- a/libbb/selinux_common.c
++++ b/libbb/selinux_common.c
+@@ -48,7 +48,7 @@ void FAST_FUNC selinux_preserve_fcontext(int fdesc)
+ 	if (fgetfilecon(fdesc, &context) < 0) {
+ 		if (errno == ENODATA || errno == ENOTSUP)
+ 			return;
+-		bb_perror_msg_and_die("fgetfilecon failed");
++		bb_simple_perror_msg_and_die("fgetfilecon failed");
+ 	}
+ 	setfscreatecon_or_die(context);
+ 	freecon(context);
+diff --git a/libbb/time.c b/libbb/time.c
+index f9b8da0b3..cab0ad602 100644
+--- a/libbb/time.c
++++ b/libbb/time.c
+@@ -258,7 +258,7 @@ char* FAST_FUNC strftime_YYYYMMDDHHMMSS(char *buf, unsigned len, time_t *tp)
+ static void get_mono(struct timespec *ts)
+ {
+ 	if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, ts))
+-		bb_error_msg_and_die("clock_gettime(MONOTONIC) failed");
++		bb_simple_error_msg_and_die("clock_gettime(MONOTONIC) failed");
+ }
+ unsigned long long FAST_FUNC monotonic_ns(void)
+ {
+diff --git a/libbb/update_passwd.c b/libbb/update_passwd.c
+index dc967683a..c605c4c64 100644
+--- a/libbb/update_passwd.c
++++ b/libbb/update_passwd.c
+@@ -25,7 +25,7 @@ static void check_selinux_update_passwd(const char *username)
+ 		return;  /* No need to check */
+ 
+ 	if (getprevcon_raw(&context) < 0)
+-		bb_perror_msg_and_die("getprevcon failed");
++		bb_simple_perror_msg_and_die("getprevcon failed");
+ 	seuser = strtok(context, ":");
+ 	if (!seuser)
+ 		bb_error_msg_and_die("invalid context '%s'", context);
+@@ -42,7 +42,7 @@ static void check_selinux_update_passwd(const char *username)
+ 
+ 		if (selinux_check_passwd_access(av) != 0)
+  die:
+-			bb_error_msg_and_die("SELinux: access denied");
++			bb_simple_error_msg_and_die("SELinux: access denied");
+ 	}
+ 	if (ENABLE_FEATURE_CLEAN_UP)
+ 		freecon(context);
+diff --git a/libbb/uuencode.c b/libbb/uuencode.c
+index f32a3da7d..d36b34f63 100644
+--- a/libbb/uuencode.c
++++ b/libbb/uuencode.c
+@@ -213,7 +213,7 @@ void FAST_FUNC read_base64(FILE *src_stream, FILE *dst_stream, int flags)
+ 			if (*in_tail == '\0')
+ 				return;
+ 			/* No */
+-			bb_error_msg_and_die("truncated base64 input");
++			bb_simple_error_msg_and_die("truncated base64 input");
+ 		}
+ 
+ 		/* It was partial decode */
+diff --git a/libbb/verror_msg.c b/libbb/verror_msg.c
+index 6d3459905..71512aee2 100644
+--- a/libbb/verror_msg.c
++++ b/libbb/verror_msg.c
+@@ -197,4 +197,19 @@ void FAST_FUNC bb_info_msg(const char *s, ...)
+ 	bb_vinfo_msg(s, p);
+ 	va_end(p);
+ }
++
++void FAST_FUNC bb_simple_info_msg(const char *s)
++{
++	bb_info_msg("%s", s);
++}
+ #endif
++
++void FAST_FUNC bb_simple_error_msg(const char *s)
++{
++	bb_error_msg("%s", s);
++}
++
++void FAST_FUNC bb_simple_error_msg_and_die(const char *s)
++{
++	bb_error_msg_and_die("%s", s);
++}
+diff --git a/libbb/warn_ignoring_args.c b/libbb/warn_ignoring_args.c
+index 3f3025c03..b24546e41 100644
+--- a/libbb/warn_ignoring_args.c
++++ b/libbb/warn_ignoring_args.c
+@@ -12,7 +12,7 @@
+ void FAST_FUNC bb_warn_ignoring_args(char *arg)
+ {
+ 	if (arg) {
+-		bb_error_msg("ignoring all arguments");
++		bb_simple_error_msg("ignoring all arguments");
+ 	}
+ }
+ #endif
+diff --git a/libbb/xconnect.c b/libbb/xconnect.c
+index eb2871cb1..e9a2470e4 100644
+--- a/libbb/xconnect.c
++++ b/libbb/xconnect.c
+@@ -66,7 +66,7 @@ int FAST_FUNC setsockopt_bindtodevice(int fd, const char *iface)
+ int FAST_FUNC setsockopt_bindtodevice(int fd UNUSED_PARAM,
+ 		const char *iface UNUSED_PARAM)
+ {
+-	bb_error_msg("SO_BINDTODEVICE is not supported on this system");
++	bb_simple_error_msg("SO_BINDTODEVICE is not supported on this system");
+ 	return -1;
+ }
+ #endif
+@@ -109,7 +109,7 @@ void FAST_FUNC xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen)
+ 			bb_perror_msg_and_die("%s (%s)",
+ 				"can't connect to remote host",
+ 				inet_ntoa(((struct sockaddr_in *)s_addr)->sin_addr));
+-		bb_perror_msg_and_die("can't connect to remote host");
++		bb_simple_perror_msg_and_die("can't connect to remote host");
+ 	}
+ }
+ 
+diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c
+index b4d512bd6..ee2dbdef1 100644
+--- a/libbb/xfuncs.c
++++ b/libbb/xfuncs.c
+@@ -426,6 +426,6 @@ int FAST_FUNC wait_for_exitstatus(pid_t pid)
+ 
+ 	n = safe_waitpid(pid, &exit_status, 0);
+ 	if (n < 0)
+-		bb_perror_msg_and_die("waitpid");
++		bb_simple_perror_msg_and_die("waitpid");
+ 	return exit_status;
+ }
+diff --git a/libbb/xfuncs_printf.c b/libbb/xfuncs_printf.c
+index 6cc60f6c0..93f325c62 100644
+--- a/libbb/xfuncs_printf.c
++++ b/libbb/xfuncs_printf.c
+@@ -27,7 +27,7 @@
+ 
+ void FAST_FUNC bb_die_memory_exhausted(void)
+ {
+-	bb_error_msg_and_die(bb_msg_memory_exhausted);
++	bb_simple_error_msg_and_die(bb_msg_memory_exhausted);
+ }
+ 
+ #ifndef DMALLOC
+@@ -40,7 +40,7 @@ void* FAST_FUNC malloc_or_warn(size_t size)
+ {
+ 	void *ptr = malloc(size);
+ 	if (ptr == NULL && size != 0)
+-		bb_error_msg(bb_msg_memory_exhausted);
++		bb_simple_error_msg(bb_msg_memory_exhausted);
+ 	return ptr;
+ }
+ 
+@@ -97,7 +97,7 @@ char* FAST_FUNC xstrndup(const char *s, int n)
+ 	char *t;
+ 
+ 	if (ENABLE_DEBUG && s == NULL)
+-		bb_error_msg_and_die("xstrndup bug");
++		bb_simple_error_msg_and_die("xstrndup bug");
+ 
+ 	/* We can just xmalloc(n+1) and strncpy into it, */
+ 	/* but think about xstrndup("abc", 10000) wastage! */
+@@ -215,13 +215,13 @@ int FAST_FUNC rename_or_warn(const char *oldpath, const char *newpath)
+ void FAST_FUNC xpipe(int filedes[2])
+ {
+ 	if (pipe(filedes))
+-		bb_perror_msg_and_die("can't create pipe");
++		bb_simple_perror_msg_and_die("can't create pipe");
+ }
+ 
+ void FAST_FUNC xdup2(int from, int to)
+ {
+ 	if (dup2(from, to) != to)
+-		bb_perror_msg_and_die("can't duplicate file descriptor");
++		bb_simple_perror_msg_and_die("can't duplicate file descriptor");
+ 		//		" %d to %d", from, to);
+ }
+ 
+@@ -245,7 +245,7 @@ void FAST_FUNC xwrite(int fd, const void *buf, size_t count)
+ 			 * or some writes succeeded, then we hit an error.
+ 			 * In either case, errno is set.
+ 			 */
+-			bb_perror_msg_and_die(
++			bb_simple_perror_msg_and_die(
+ 				size >= 0 ? "short write" : "write error"
+ 			);
+ 		}
+@@ -259,7 +259,7 @@ void FAST_FUNC xwrite_str(int fd, const char *str)
+ void FAST_FUNC xclose(int fd)
+ {
+ 	if (close(fd))
+-		bb_perror_msg_and_die("close failed");
++		bb_simple_perror_msg_and_die("close failed");
+ }
+ 
+ // Die with an error message if we can't lseek to the right spot.
+@@ -267,9 +267,7 @@ off_t FAST_FUNC xlseek(int fd, off_t offset, int whence)
+ {
+ 	off_t off = lseek(fd, offset, whence);
+ 	if (off == (off_t)-1) {
+-		if (whence == SEEK_SET)
+-			bb_perror_msg_and_die("lseek(%"OFF_FMT"u)", offset);
+-		bb_perror_msg_and_die("lseek");
++		bb_perror_msg_and_die("lseek(%"OFF_FMT"u, %d)", offset, whence);
+ 	}
+ 	return off;
+ }
+@@ -384,23 +382,23 @@ void FAST_FUNC bb_unsetenv_and_free(char *var)
+ // setgid() will fail and we'll _still_be_root_, which is bad.)
+ void FAST_FUNC xsetgid(gid_t gid)
+ {
+-	if (setgid(gid)) bb_perror_msg_and_die("setgid");
++	if (setgid(gid)) bb_simple_perror_msg_and_die("setgid");
+ }
+ 
+ // Die with an error message if we can't set uid.  (See xsetgid() for why.)
+ void FAST_FUNC xsetuid(uid_t uid)
+ {
+-	if (setuid(uid)) bb_perror_msg_and_die("setuid");
++	if (setuid(uid)) bb_simple_perror_msg_and_die("setuid");
+ }
+ 
+ void FAST_FUNC xsetegid(gid_t egid)
+ {
+-	if (setegid(egid)) bb_perror_msg_and_die("setegid");
++	if (setegid(egid)) bb_simple_perror_msg_and_die("setegid");
+ }
+ 
+ void FAST_FUNC xseteuid(uid_t euid)
+ {
+-	if (seteuid(euid)) bb_perror_msg_and_die("seteuid");
++	if (seteuid(euid)) bb_simple_perror_msg_and_die("seteuid");
+ }
+ 
+ // Die if we can't chdir to a new path.
+@@ -413,7 +411,7 @@ void FAST_FUNC xchdir(const char *path)
+ void FAST_FUNC xfchdir(int fd)
+ {
+ 	if (fchdir(fd))
+-		bb_perror_msg_and_die("fchdir");
++		bb_simple_perror_msg_and_die("fchdir");
+ }
+ 
+ void FAST_FUNC xchroot(const char *path)
+@@ -463,7 +461,7 @@ int FAST_FUNC xsocket(int domain, int type, int protocol)
+ IF_FEATURE_IPV6(if (domain == AF_INET6) s = "INET6";)
+ 		bb_perror_msg_and_die("socket(AF_%s,%d,%d)", s, type, protocol);
+ #else
+-		bb_perror_msg_and_die("socket");
++		bb_simple_perror_msg_and_die("socket");
+ #endif
+ 	}
+ 
+@@ -473,13 +471,13 @@ IF_FEATURE_IPV6(if (domain == AF_INET6) s = "INET6";)
+ // Die with an error message if we can't bind a socket to an address.
+ void FAST_FUNC xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen)
+ {
+-	if (bind(sockfd, my_addr, addrlen)) bb_perror_msg_and_die("bind");
++	if (bind(sockfd, my_addr, addrlen)) bb_simple_perror_msg_and_die("bind");
+ }
+ 
+ // Die with an error message if we can't listen for connections on a socket.
+ void FAST_FUNC xlisten(int s, int backlog)
+ {
+-	if (listen(s, backlog)) bb_perror_msg_and_die("listen");
++	if (listen(s, backlog)) bb_simple_perror_msg_and_die("listen");
+ }
+ 
+ /* Die with an error message if sendto failed.
+@@ -491,7 +489,7 @@ ssize_t FAST_FUNC xsendto(int s, const void *buf, size_t len, const struct socka
+ 	if (ret < 0) {
+ 		if (ENABLE_FEATURE_CLEAN_UP)
+ 			close(s);
+-		bb_perror_msg_and_die("sendto");
++		bb_simple_perror_msg_and_die("sendto");
+ 	}
+ 	return ret;
+ }
+@@ -519,12 +517,12 @@ void FAST_FUNC selinux_or_die(void)
+ #if ENABLE_SELINUX
+ 	int rc = is_selinux_enabled();
+ 	if (rc == 0) {
+-		bb_error_msg_and_die("SELinux is disabled");
++		bb_simple_error_msg_and_die("SELinux is disabled");
+ 	} else if (rc < 0) {
+-		bb_error_msg_and_die("is_selinux_enabled() failed");
++		bb_simple_error_msg_and_die("is_selinux_enabled() failed");
+ 	}
+ #else
+-	bb_error_msg_and_die("SELinux support is disabled");
++	bb_simple_error_msg_and_die("SELinux support is disabled");
+ #endif
+ }
+ 
+@@ -675,7 +673,7 @@ pid_t FAST_FUNC xfork(void)
+ 	pid_t pid;
+ 	pid = fork();
+ 	if (pid < 0) /* wtf? */
+-		bb_perror_msg_and_die("vfork"+1);
++		bb_simple_perror_msg_and_die("vfork"+1);
+ 	return pid;
+ }
+ #endif
+diff --git a/libbb/xgetcwd.c b/libbb/xgetcwd.c
+index 7f9088bda..f4e768982 100644
+--- a/libbb/xgetcwd.c
++++ b/libbb/xgetcwd.c
+@@ -33,7 +33,7 @@ xrealloc_getcwd_or_warn(char *cwd)
+ 			if (errno == ERANGE)
+ 				continue;
+ 			free(cwd);
+-			bb_perror_msg("getcwd");
++			bb_simple_perror_msg("getcwd");
+ 			return NULL;
+ 		}
+ 		cwd = xrealloc(cwd, strlen(cwd) + 1);
+diff --git a/libbb/xgethostbyname.c b/libbb/xgethostbyname.c
+index 89d0329cc..9446daba7 100644
+--- a/libbb/xgethostbyname.c
++++ b/libbb/xgethostbyname.c
+@@ -12,6 +12,6 @@ struct hostent* FAST_FUNC xgethostbyname(const char *name)
+ {
+ 	struct hostent *retval = gethostbyname(name);
+ 	if (!retval)
+-		bb_herror_msg_and_die("%s", name);
++		bb_simple_herror_msg_and_die(name);
+ 	return retval;
+ }
+diff --git a/loginutils/addgroup.c b/loginutils/addgroup.c
+index baa961ff3..2a83c8a15 100644
+--- a/loginutils/addgroup.c
++++ b/loginutils/addgroup.c
+@@ -149,7 +149,7 @@ int addgroup_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	/* need to be root */
+ 	if (geteuid()) {
+-		bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
++		bb_simple_error_msg_and_die(bb_msg_perm_denied_are_you_root);
+ 	}
+ 	/* Syntax:
+ 	 *  addgroup group
+diff --git a/loginutils/adduser.c b/loginutils/adduser.c
+index 850c810c4..d3c795afa 100644
+--- a/loginutils/adduser.c
++++ b/loginutils/adduser.c
+@@ -159,7 +159,7 @@ static void passwd_wrapper(const char *login_name) NORETURN;
+ static void passwd_wrapper(const char *login_name)
+ {
+ 	BB_EXECLP("passwd", "passwd", "--", login_name, NULL);
+-	bb_error_msg_and_die("can't execute passwd, you must set password manually");
++	bb_simple_error_msg_and_die("can't execute passwd, you must set password manually");
+ }
+ 
+ //FIXME: upstream adduser has no short options! NOT COMPATIBLE!
+@@ -193,7 +193,7 @@ int adduser_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	/* got root? */
+ 	if (geteuid()) {
+-		bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
++		bb_simple_error_msg_and_die(bb_msg_perm_denied_are_you_root);
+ 	}
+ 
+ 	pw.pw_gecos = (char *)"Linux User,,,";
+diff --git a/loginutils/chpasswd.c b/loginutils/chpasswd.c
+index dd0532c66..4e70b2557 100644
+--- a/loginutils/chpasswd.c
++++ b/loginutils/chpasswd.c
+@@ -63,7 +63,7 @@ int chpasswd_main(int argc UNUSED_PARAM, char **argv)
+ 	int opt;
+ 
+ 	if (getuid() != 0)
+-		bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
++		bb_simple_error_msg_and_die(bb_msg_perm_denied_are_you_root);
+ 
+ 	opt = getopt32long(argv, "^" "emc:R:" "\0" "m--ec:e--mc:c--em",
+ 			chpasswd_longopts,
+@@ -81,7 +81,7 @@ int chpasswd_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 		pass = strchr(name, ':');
+ 		if (!pass)
+-			bb_error_msg_and_die("missing new password");
++			bb_simple_error_msg_and_die("missing new password");
+ 		*pass++ = '\0';
+ 
+ 		xuname2uid(name); /* dies if there is no such user */
+diff --git a/loginutils/deluser.c b/loginutils/deluser.c
+index d7e9327ba..56bc7eaa6 100644
+--- a/loginutils/deluser.c
++++ b/loginutils/deluser.c
+@@ -76,7 +76,7 @@ int deluser_main(int argc, char **argv)
+ #endif
+ 
+ 	if (geteuid() != 0)
+-		bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
++		bb_simple_error_msg_and_die(bb_msg_perm_denied_are_you_root);
+ 
+ 	name = argv[1];
+ 	member = NULL;
+diff --git a/loginutils/getty.c b/loginutils/getty.c
+index 23e92bc77..7393a3d1c 100644
+--- a/loginutils/getty.c
++++ b/loginutils/getty.c
+@@ -168,7 +168,7 @@ static void parse_speeds(char *arg)
+ 		/* note: arg "0" turns into speed B0 */
+ 		G.numspeed++;
+ 		if (G.numspeed > MAX_SPEED)
+-			bb_error_msg_and_die("too many alternate speeds");
++			bb_simple_error_msg_and_die("too many alternate speeds");
+ 	}
+ 	debug("exiting parse_speeds\n");
+ }
+@@ -230,7 +230,7 @@ static void open_tty(void)
+ 		 * Make sure it is open for read/write.
+ 		 */
+ 		if ((fcntl(0, F_GETFL) & (O_RDWR|O_RDONLY|O_WRONLY)) != O_RDWR)
+-			bb_error_msg_and_die("stdin is not open for read/write");
++			bb_simple_error_msg_and_die("stdin is not open for read/write");
+ 
+ 		/* Try to get real tty name instead of "-" */
+ 		n = xmalloc_ttyname(0);
+@@ -243,7 +243,7 @@ static void open_tty(void)
+ static void set_tty_attrs(void)
+ {
+ 	if (tcsetattr_stdin_TCSANOW(&G.tty_attrs) < 0)
+-		bb_perror_msg_and_die("tcsetattr");
++		bb_simple_perror_msg_and_die("tcsetattr");
+ }
+ 
+ /* We manipulate tty_attrs this way:
+@@ -485,7 +485,7 @@ static char *get_logname(void)
+ 				finalize_tty_attrs();
+ 				if (errno == EINTR || errno == EIO)
+ 					exit(EXIT_SUCCESS);
+-				bb_perror_msg_and_die(bb_msg_read_error);
++				bb_simple_perror_msg_and_die(bb_msg_read_error);
+ 			}
+ 
+ 			switch (c) {
+@@ -582,7 +582,7 @@ int getty_main(int argc UNUSED_PARAM, char **argv)
+ 			//	" sid %d pgid %d",
+ 			//	pid, getppid(),
+ 			//	getsid(0), getpgid(0));
+-			bb_perror_msg_and_die("setsid");
++			bb_simple_perror_msg_and_die("setsid");
+ 			/*
+ 			 * When we can end up here?
+ 			 * Example: setsid() fails when run alone in interactive shell:
+@@ -651,13 +651,13 @@ int getty_main(int argc UNUSED_PARAM, char **argv)
+ 	tsid = tcgetsid(STDIN_FILENO);
+ 	if (tsid < 0 || pid != tsid) {
+ 		if (ioctl(STDIN_FILENO, TIOCSCTTY, /*force:*/ (long)1) < 0)
+-			bb_perror_msg_and_die("TIOCSCTTY");
++			bb_simple_perror_msg_and_die("TIOCSCTTY");
+ 	}
+ 
+ #ifdef __linux__
+ 	/* Make ourself a foreground process group within our session */
+ 	if (tcsetpgrp(STDIN_FILENO, pid) < 0)
+-		bb_perror_msg_and_die("tcsetpgrp");
++		bb_simple_perror_msg_and_die("tcsetpgrp");
+ #endif
+ 
+ 	/*
+@@ -669,7 +669,7 @@ int getty_main(int argc UNUSED_PARAM, char **argv)
+ 	 * 5 seconds seems to be a good value.
+ 	 */
+ 	if (tcgetattr(STDIN_FILENO, &G.tty_attrs) < 0)
+-		bb_perror_msg_and_die("tcgetattr");
++		bb_simple_perror_msg_and_die("tcgetattr");
+ 
+ 	/* Update the utmp file. This tty is ours now! */
+ 	update_utmp(pid, LOGIN_PROCESS, G.tty_name, "LOGIN", G.fakehost);
+diff --git a/loginutils/login.c b/loginutils/login.c
+index a08642a34..4e65b3a19 100644
+--- a/loginutils/login.c
++++ b/loginutils/login.c
+@@ -358,7 +358,7 @@ int login_main(int argc UNUSED_PARAM, char **argv)
+ 	opt = getopt32(argv, "f:h:p", &opt_user, &opt_host);
+ 	if (opt & LOGIN_OPT_f) {
+ 		if (!run_by_root)
+-			bb_error_msg_and_die("-f is for root only");
++			bb_simple_error_msg_and_die("-f is for root only");
+ 		safe_strncpy(username, opt_user, sizeof(username));
+ 	}
+ 	argv += optind;
+@@ -529,7 +529,7 @@ int login_main(int argc UNUSED_PARAM, char **argv)
+ 	child_pid = vfork();
+ 	if (child_pid != 0) {
+ 		if (child_pid < 0)
+-			bb_perror_msg("vfork");
++			bb_simple_perror_msg("vfork");
+ 		else {
+ 			wait_for_exitstatus(child_pid);
+ 			update_utmp_DEAD_PROCESS(child_pid);
+diff --git a/loginutils/su.c b/loginutils/su.c
+index 41291ea8f..7c1fc69c5 100644
+--- a/loginutils/su.c
++++ b/loginutils/su.c
+@@ -147,7 +147,7 @@ int su_main(int argc UNUSED_PARAM, char **argv)
+ 			syslog(LOG_NOTICE, "%c %s %s:%s",
+ 				'-', tty, old_user, opt_username);
+ 		bb_do_delay(LOGIN_FAIL_DELAY);
+-		bb_error_msg_and_die("incorrect password");
++		bb_simple_error_msg_and_die("incorrect password");
+ 	}
+ 
+ 	if (ENABLE_FEATURE_CLEAN_UP && ENABLE_FEATURE_SU_SYSLOG) {
+@@ -165,7 +165,7 @@ int su_main(int argc UNUSED_PARAM, char **argv)
+ 		 * probably a uucp account or has restricted access.  Don't
+ 		 * compromise the account by allowing access with a standard
+ 		 * shell.  */
+-		bb_error_msg("using restricted shell");
++		bb_simple_error_msg("using restricted shell");
+ 		opt_shell = NULL; /* ignore -s PROG */
+ 	}
+ 	/* else: user can run whatever he wants via "su -s PROG USER".
+diff --git a/loginutils/sulogin.c b/loginutils/sulogin.c
+index 9bb4d3613..099085340 100644
+--- a/loginutils/sulogin.c
++++ b/loginutils/sulogin.c
+@@ -56,7 +56,7 @@ int sulogin_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	pwd = getpwuid(0);
+ 	if (!pwd) {
+-		bb_error_msg_and_die("no password entry for root");
++		bb_simple_error_msg_and_die("no password entry for root");
+ 	}
+ 
+ 	while (1) {
+@@ -68,17 +68,17 @@ int sulogin_main(int argc UNUSED_PARAM, char **argv)
+ 		);
+ 		if (r < 0) {
+ 			/* ^D, ^C, timeout, or read error */
+-			bb_info_msg("normal startup");
++			bb_simple_info_msg("normal startup");
+ 			return 0;
+ 		}
+ 		if (r > 0) {
+ 			break;
+ 		}
+ 		bb_do_delay(LOGIN_FAIL_DELAY);
+-		bb_info_msg("Login incorrect");
++		bb_simple_info_msg("Login incorrect");
+ 	}
+ 
+-	bb_info_msg("starting shell for system maintenance");
++	bb_simple_info_msg("starting shell for system maintenance");
+ 
+ 	IF_SELINUX(renew_current_security_context());
+ 
+diff --git a/mailutils/mail.c b/mailutils/mail.c
+index 6726654f7..3a1fd6949 100644
+--- a/mailutils/mail.c
++++ b/mailutils/mail.c
+@@ -15,7 +15,7 @@ static void signal_handler(int signo)
+ {
+ #define err signo
+ 	if (SIGALRM == signo) {
+-		bb_error_msg_and_die("timed out");
++		bb_simple_error_msg_and_die("timed out");
+ 	}
+ 
+ 	// SIGCHLD. reap zombies
+@@ -128,7 +128,7 @@ static void encode_n_base64(const char *fname, const char *text, size_t len)
+ 		if (fname) {
+ 			size = fread((char *)src_buf, 1, SRC_BUF_SIZE, fp);
+ 			if ((ssize_t)size < 0)
+-				bb_perror_msg_and_die(bb_msg_read_error);
++				bb_simple_perror_msg_and_die(bb_msg_read_error);
+ 		} else {
+ 			size = len;
+ 			if (len > SRC_BUF_SIZE)
+@@ -179,5 +179,5 @@ void FAST_FUNC get_cred_or_die(int fd)
+ 		G.pass = xmalloc_reads(fd, /* maxsize: */ NULL);
+ 	}
+ 	if (!G.user || !*G.user || !G.pass)
+-		bb_error_msg_and_die("no username or password");
++		bb_simple_error_msg_and_die("no username or password");
+ }
+diff --git a/mailutils/popmaildir.c b/mailutils/popmaildir.c
+index 589456715..6927e3a58 100644
+--- a/mailutils/popmaildir.c
++++ b/mailutils/popmaildir.c
+@@ -222,7 +222,7 @@ int popmaildir_main(int argc UNUSED_PARAM, char **argv)
+ 			fp = popen(delivery, "w");
+ 			unsetenv("FILENAME");
+ 			if (!fp) {
+-				bb_perror_msg("delivery helper");
++				bb_simple_perror_msg("delivery helper");
+ 				break;
+ 			}
+ 		} else
+diff --git a/mailutils/sendmail.c b/mailutils/sendmail.c
+index 32c50ba84..1bdc1c300 100644
+--- a/mailutils/sendmail.c
++++ b/mailutils/sendmail.c
+@@ -338,7 +338,7 @@ int sendmail_main(int argc UNUSED_PARAM, char **argv)
+ 			smtp_check(NULL, 250);
+ 		else
+ 		if (code != 250)
+-			bb_error_msg_and_die("SMTP init failed");
++			bb_simple_error_msg_and_die("SMTP init failed");
+ 	} else {
+ 		// vanilla connection
+ 		int fd;
+diff --git a/miscutils/bc.c b/miscutils/bc.c
+index aba51e5f8..7ac30dd53 100644
+--- a/miscutils/bc.c
++++ b/miscutils/bc.c
+@@ -893,7 +893,7 @@ static void fflush_and_check(void)
+ {
+ 	fflush_all();
+ 	if (ferror(stdout) || ferror(stderr))
+-		bb_perror_msg_and_die("output error");
++		bb_simple_perror_msg_and_die("output error");
+ }
+ 
+ #if ENABLE_FEATURE_CLEAN_UP
+@@ -908,7 +908,7 @@ static void quit(void) NORETURN;
+ static void quit(void)
+ {
+ 	if (ferror(stdin))
+-		bb_perror_msg_and_die("input error");
++		bb_simple_perror_msg_and_die("input error");
+ 	fflush_and_check();
+ 	dbg_exec("quit(): exiting with exitcode SUCCESS");
+ 	exit(0);
+@@ -2576,7 +2576,7 @@ static void xc_read_line(BcVec *vec, FILE *fp)
+ 				goto get_char;
+ 			if (c == EOF) {
+ 				if (ferror(fp))
+-					bb_perror_msg_and_die("input error");
++					bb_simple_perror_msg_and_die("input error");
+ 				// Note: EOF does not append '\n'
+ 				break;
+ 			}
+@@ -6925,9 +6925,9 @@ static BC_STATUS zxc_vm_process(const char *text)
+ 		ip = (void*)G.prog.exestack.v;
+ #if SANITY_CHECKS
+ 		if (G.prog.exestack.len != 1) // should have only main's IP
+-			bb_error_msg_and_die("BUG:call stack");
++			bb_simple_error_msg_and_die("BUG:call stack");
+ 		if (ip->func != BC_PROG_MAIN)
+-			bb_error_msg_and_die("BUG:not MAIN");
++			bb_simple_error_msg_and_die("BUG:not MAIN");
+ #endif
+ 		f = xc_program_func_BC_PROG_MAIN();
+ 		// bc discards strings, constants and code after each
+@@ -6943,7 +6943,7 @@ static BC_STATUS zxc_vm_process(const char *text)
+ 		if (IS_BC) {
+ #if SANITY_CHECKS
+ 			if (G.prog.results.len != 0) // should be empty
+-				bb_error_msg_and_die("BUG:data stack");
++				bb_simple_error_msg_and_die("BUG:data stack");
+ #endif
+ 			IF_BC(bc_vec_pop_all(&f->strs);)
+ 			IF_BC(bc_vec_pop_all(&f->consts);)
+diff --git a/miscutils/chat.c b/miscutils/chat.c
+index 5183d1369..a04565063 100644
+--- a/miscutils/chat.c
++++ b/miscutils/chat.c
+@@ -307,7 +307,7 @@ int chat_main(int argc UNUSED_PARAM, char **argv)
+ 			} else if (DIR_SAY == key) {
+ 				// just print argument verbatim
+ 				// TODO: should we use full_write() to avoid unistd/stdio conflict?
+-				bb_error_msg("%s", arg);
++				bb_simple_error_msg(arg);
+ 			}
+ 			// next, please!
+ 			argv++;
+diff --git a/miscutils/crond.c b/miscutils/crond.c
+index b533a3991..2e8ca8b68 100644
+--- a/miscutils/crond.c
++++ b/miscutils/crond.c
+@@ -731,7 +731,7 @@ fork_job(const char *user, int mailFd, CronLine *line, bool run_sendmail)
+ 	logmode = sv_logmode;
+ 
+ 	if (pid < 0) {
+-		bb_perror_msg("vfork");
++		bb_simple_perror_msg("vfork");
+  err:
+ 		pid = 0;
+ 	} /* else: PARENT, FORK SUCCESS */
+@@ -861,7 +861,7 @@ static pid_t start_one_job(const char *user, CronLine *line)
+ 		bb_error_msg_and_die("can't execute '%s' for user %s", shell, user);
+ 	}
+ 	if (pid < 0) {
+-		bb_perror_msg("vfork");
++		bb_simple_perror_msg("vfork");
+  err:
+ 		pid = 0;
+ 	}
+diff --git a/miscutils/crontab.c b/miscutils/crontab.c
+index 96dc4741a..c71d914fc 100644
+--- a/miscutils/crontab.c
++++ b/miscutils/crontab.c
+@@ -107,7 +107,7 @@ int crontab_main(int argc UNUSED_PARAM, char **argv)
+ 	if (sanitize_env_if_suid()) { /* Clears dangerous stuff, sets PATH */
+ 		/* Run by non-root */
+ 		if (opt_ler & (OPT_u|OPT_c))
+-			bb_error_msg_and_die(bb_msg_you_must_be_root);
++			bb_simple_error_msg_and_die(bb_msg_you_must_be_root);
+ 	}
+ 
+ 	if (opt_ler & OPT_u) {
+diff --git a/miscutils/dc.c b/miscutils/dc.c
+index 5aef64b60..ef93c20ba 100644
+--- a/miscutils/dc.c
++++ b/miscutils/dc.c
+@@ -39,14 +39,14 @@ static unsigned check_under(void)
+ {
+ 	unsigned p = pointer;
+ 	if (p == 0)
+-		bb_error_msg_and_die("stack underflow");
++		bb_simple_error_msg_and_die("stack underflow");
+ 	return p - 1;
+ }
+ 
+ static void push(double a)
+ {
+ 	if (pointer >= STACK_SIZE)
+-		bb_error_msg_and_die("stack overflow");
++		bb_simple_error_msg_and_die("stack overflow");
+ 	stack[pointer++] = a;
+ }
+ 
+diff --git a/miscutils/devfsd.c b/miscutils/devfsd.c
+index e4d104d0c..f3d935b2e 100644
+--- a/miscutils/devfsd.c
++++ b/miscutils/devfsd.c
+@@ -344,14 +344,19 @@ static const char bb_msg_variable_not_found[] ALIGN1 = "variable: %s not found";
+ /* Busybox stuff */
+ #if ENABLE_DEVFSD_VERBOSE || ENABLE_DEBUG
+ #define info_logger(p, fmt, args...)                 bb_info_msg(fmt, ## args)
++#define simple_info_logger(p, msg)                   bb_simple_info_msg(msg)
+ #define msg_logger(p, fmt, args...)                  bb_error_msg(fmt, ## args)
++#define simple_msg_logger(p, msg)                    bb_simple_error_msg(msg)
+ #define msg_logger_and_die(p, fmt, args...)          bb_error_msg_and_die(fmt, ## args)
++#define simple_msg_logger_and_die(p, msg)            bb_simple_error_msg_and_die(msg)
+ #define error_logger(p, fmt, args...)                bb_perror_msg(fmt, ## args)
+ #define error_logger_and_die(p, fmt, args...)        bb_perror_msg_and_die(fmt, ## args)
+ #else
+ #define info_logger(p, fmt, args...)
+ #define msg_logger(p, fmt, args...)
++#define simple_msg_logger(p, msg)
+ #define msg_logger_and_die(p, fmt, args...)           exit(EXIT_FAILURE)
++#define simple_msg_logger_and_die(p, msg)             exit(EXIT_FAILURE)
+ #define error_logger(p, fmt, args...)
+ #define error_logger_and_die(p, fmt, args...)         exit(EXIT_FAILURE)
+ #endif
+@@ -727,7 +732,7 @@ static int do_servicing(int fd, unsigned long event_mask)
+ 		caught_sighup = FALSE;
+ 		return c_sighup;
+ 	}
+-	msg_logger_and_die(LOG_ERR, "read error on control file");
++	simple_msg_logger_and_die(LOG_ERR, "read error on control file");
+ }   /*  End Function do_servicing  */
+ 
+ static void service_name(const struct devfsd_notify_struct *info)
+@@ -786,7 +791,7 @@ static void service_name(const struct devfsd_notify_struct *info)
+ 				action_compat(info, entry->action.what);
+ 				break;
+ 			default:
+-				msg_logger_and_die(LOG_ERR, "Unknown action");
++				simple_msg_logger_and_die(LOG_ERR, "Unknown action");
+ 		}
+ 	}
+ }   /*  End Function service_name  */
+@@ -1691,7 +1696,7 @@ int st_expr_expand(char *output, unsigned int length, const char *input,
+ 	}
+ 	return FALSE;
+ st_expr_expand_out:
+-	info_logger(LOG_INFO, bb_msg_small_buffer);
++	simple_info_logger(LOG_INFO, bb_msg_small_buffer);
+ 	return FALSE;
+ }   /*  End Function st_expr_expand  */
+ 
+@@ -1775,7 +1780,7 @@ static const char *expand_variable(char *buffer, unsigned int length,
+ 		return input + len;
+ 	}
+ 	if (ch != ':' || ptr[1] != '-') {
+-		info_logger(LOG_INFO, "illegal char in var name");
++		simple_info_logger(LOG_INFO, "illegal char in var name");
+ 		return NULL;
+ 	}
+ 	/*  It's that handy "${var:-word}" expression. Check if var is defined  */
+@@ -1838,7 +1843,7 @@ static const char *expand_variable(char *buffer, unsigned int length,
+ 	*out_pos += len;
+ 	return input;
+ expand_variable_out:
+-	info_logger(LOG_INFO, bb_msg_small_buffer);
++	simple_info_logger(LOG_INFO, bb_msg_small_buffer);
+ 	return NULL;
+ }   /*  End Function expand_variable  */
+ 
+diff --git a/miscutils/devmem.c b/miscutils/devmem.c
+index 51ac3f22f..e8dce5225 100644
+--- a/miscutils/devmem.c
++++ b/miscutils/devmem.c
+@@ -89,7 +89,7 @@ int devmem_main(int argc UNUSED_PARAM, char **argv)
+ 			fd,
+ 			target & ~(off_t)(page_size - 1));
+ 	if (map_base == MAP_FAILED)
+-		bb_perror_msg_and_die("mmap");
++		bb_simple_perror_msg_and_die("mmap");
+ 
+ //	printf("Memory mapped at address %p.\n", map_base);
+ 
+@@ -110,7 +110,7 @@ int devmem_main(int argc UNUSED_PARAM, char **argv)
+ 			read_result = *(volatile uint64_t*)virt_addr;
+ 			break;
+ 		default:
+-			bb_error_msg_and_die("bad width");
++			bb_simple_error_msg_and_die("bad width");
+ 		}
+ //		printf("Value at address 0x%"OFF_FMT"X (%p): 0x%llX\n",
+ //			target, virt_addr,
+@@ -136,7 +136,7 @@ int devmem_main(int argc UNUSED_PARAM, char **argv)
+ //			read_result = *(volatile uint64_t*)virt_addr;
+ 			break;
+ 		default:
+-			bb_error_msg_and_die("bad width");
++			bb_simple_error_msg_and_die("bad width");
+ 		}
+ //		printf("Written 0x%llX; readback 0x%llX\n",
+ //				(unsigned long long)writeval,
+@@ -145,7 +145,7 @@ int devmem_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	if (ENABLE_FEATURE_CLEAN_UP) {
+ 		if (munmap(map_base, mapped_size) == -1)
+-			bb_perror_msg_and_die("munmap");
++			bb_simple_perror_msg_and_die("munmap");
+ 		close(fd);
+ 	}
+ 
+diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
+index bba22d6d1..141957809 100644
+--- a/miscutils/fbsplash.c
++++ b/miscutils/fbsplash.c
+@@ -183,7 +183,7 @@ static void fb_open(const char *strfb_device)
+ 			(G.scr_var.yres_virtual ?: G.scr_var.yres) * G.scr_fix.line_length,
+ 			PROT_WRITE, MAP_SHARED, fbfd, 0);
+ 	if (G.addr == MAP_FAILED)
+-		bb_perror_msg_and_die("mmap");
++		bb_simple_perror_msg_and_die("mmap");
+ 
+ 	// point to the start of the visible screen
+ 	G.addr += G.scr_var.yoffset * G.scr_fix.line_length + G.scr_var.xoffset * G.bytes_per_pixel;
+diff --git a/miscutils/flash_eraseall.c b/miscutils/flash_eraseall.c
+index a3dabdadb..c76d9a699 100644
+--- a/miscutils/flash_eraseall.c
++++ b/miscutils/flash_eraseall.c
+@@ -120,7 +120,7 @@ int flash_eraseall_main(int argc UNUSED_PARAM, char **argv)
+ 				if (clmlen > 8)
+ 					clmlen = 8;
+ 				if (clmlen == 0)
+-					bb_error_msg_and_die("autoplacement selected and no empty space in oob");
++					bb_simple_error_msg_and_die("autoplacement selected and no empty space in oob");
+ 			} else {
+ 				/* Legacy mode */
+ 				switch (meminfo.oobsize) {
+@@ -168,9 +168,9 @@ int flash_eraseall_main(int argc UNUSED_PARAM, char **argv)
+ 				if (errno == EOPNOTSUPP) {
+ 					flags |= OPTION_N;
+ 					if (flags & IS_NAND)
+-						bb_error_msg_and_die("bad block check not available");
++						bb_simple_error_msg_and_die("bad block check not available");
+ 				} else {
+-					bb_perror_msg_and_die("MEMGETBADBLOCK error");
++					bb_simple_perror_msg_and_die("MEMGETBADBLOCK error");
+ 				}
+ 			}
+ 		}
+diff --git a/miscutils/hdparm.c b/miscutils/hdparm.c
+index 342e240fa..b453efba9 100644
+--- a/miscutils/hdparm.c
++++ b/miscutils/hdparm.c
+@@ -810,7 +810,7 @@ static void identify(uint16_t *val)
+ 		like_std = 3;
+ 	} else
+ 		/* "Unknown device type:\n\tbits 15&14 of general configuration word 0 both set to 1.\n" */
+-		bb_error_msg_and_die("unknown device type");
++		bb_simple_error_msg_and_die("unknown device type");
+ 
+ 	printf("%sremovable media\n", !(val[GEN_CONFIG] & MEDIA_REMOVABLE) ? "non-" : "");
+ 	/* Info from the specific configuration word says whether or not the
+@@ -1440,7 +1440,7 @@ static void flush_buffer_cache(/*int fd*/ void)
+ 	sleep(1);
+ 	if (ioctl(fd, HDIO_DRIVE_CMD, NULL) && errno != EINVAL) {	/* await completion */
+ 		if (ENABLE_IOCTL_HEX2STR_ERROR) /* To be coherent with ioctl_or_warn */
+-			bb_perror_msg("HDIO_DRIVE_CMD");
++			bb_simple_perror_msg("HDIO_DRIVE_CMD");
+ 		else
+ 			bb_perror_msg("ioctl %#x failed", HDIO_DRIVE_CMD);
+ 	}
+@@ -1506,7 +1506,7 @@ static void do_time(int cache /*,int fd*/)
+ 	char *buf = xmalloc(TIMING_BUF_BYTES);
+ 
+ 	if (mlock(buf, TIMING_BUF_BYTES))
+-		bb_perror_msg_and_die("mlock");
++		bb_simple_perror_msg_and_die("mlock");
+ 
+ 	/* Clear out the device request queues & give them time to complete.
+ 	 * NB: *small* delay. User is expected to have a clue and to not run
+@@ -1857,7 +1857,7 @@ static void process_dev(char *devname)
+ 		char buf[512];
+ 		flush_buffer_cache();
+ 		if (-1 == read(fd, buf, sizeof(buf)))
+-			bb_perror_msg("read of 512 bytes failed");
++			bb_simple_perror_msg("read of 512 bytes failed");
+ 	}
+ #endif  /* HDIO_DRIVE_CMD */
+ 	if (getset_mult || get_identity) {
+@@ -1865,7 +1865,7 @@ static void process_dev(char *devname)
+ 		if (ioctl(fd, HDIO_GET_MULTCOUNT, &multcount)) {
+ 			/* To be coherent with ioctl_or_warn. */
+ 			if (getset_mult && ENABLE_IOCTL_HEX2STR_ERROR)
+-				bb_perror_msg("HDIO_GET_MULTCOUNT");
++				bb_simple_perror_msg("HDIO_GET_MULTCOUNT");
+ 			else
+ 				bb_perror_msg("ioctl %#x failed", HDIO_GET_MULTCOUNT);
+ 		} else if (getset_mult) {
+@@ -1985,7 +1985,7 @@ static void process_dev(char *devname)
+ 		} else if (errno == -ENOMSG)
+ 			puts(" no identification info available");
+ 		else if (ENABLE_IOCTL_HEX2STR_ERROR)  /* To be coherent with ioctl_or_warn */
+-			bb_perror_msg("HDIO_GET_IDENTITY");
++			bb_simple_perror_msg("HDIO_GET_IDENTITY");
+ 		else
+ 			bb_perror_msg("ioctl %#x failed", HDIO_GET_IDENTITY);
+ 	}
+diff --git a/miscutils/hexedit.c b/miscutils/hexedit.c
+index 5c2f4a555..898d77376 100644
+--- a/miscutils/hexedit.c
++++ b/miscutils/hexedit.c
+@@ -193,7 +193,7 @@ static int remap(unsigned cur_pos)
+ 	);
+ 	if (G.baseaddr == MAP_FAILED) {
+ 		restore_term();
+-		bb_perror_msg_and_die("mmap");
++		bb_simple_perror_msg_and_die("mmap");
+ 	}
+ 
+ 	G.current_byte = G.baseaddr + cur_pos;
+diff --git a/miscutils/i2c_tools.c b/miscutils/i2c_tools.c
+index 7a2e8534a..82a559f74 100644
+--- a/miscutils/i2c_tools.c
++++ b/miscutils/i2c_tools.c
+@@ -344,7 +344,7 @@ static void get_funcs_matrix(int fd, unsigned long *funcs)
+ static void check_funcs_test_end(int funcs, int pec, const char *err)
+ {
+ 	if (pec && !(funcs & (I2C_FUNC_SMBUS_PEC | I2C_FUNC_I2C)))
+-		bb_error_msg("warning: adapter does not support PEC");
++		bb_simple_error_msg("warning: adapter does not support PEC");
+ 
+ 	if (err)
+ 		bb_error_msg_and_die(
+@@ -392,7 +392,7 @@ static void check_read_funcs(int fd, int mode, int data_addr, int pec)
+ 		break;
+ #endif /* ENABLE_I2CDUMP */
+ 	default:
+-		bb_error_msg_and_die("internal error");
++		bb_simple_error_msg_and_die("internal error");
+ 	}
+ 	check_funcs_test_end(funcs, pec, err);
+ }
+@@ -438,7 +438,7 @@ static void confirm_or_abort(void)
+ {
+ 	fprintf(stderr, "Continue? [y/N] ");
+ 	if (!bb_ask_y_confirmation())
+-		bb_error_msg_and_die("aborting");
++		bb_simple_error_msg_and_die("aborting");
+ }
+ 
+ /*
+@@ -449,20 +449,20 @@ static void confirm_or_abort(void)
+  */
+ static void confirm_action(int bus_addr, int mode, int data_addr, int pec)
+ {
+-	bb_error_msg("WARNING! This program can confuse your I2C bus");
++	bb_simple_error_msg("WARNING! This program can confuse your I2C bus");
+ 
+ 	/* Don't let the user break his/her EEPROMs */
+ 	if (bus_addr >= 0x50 && bus_addr <= 0x57 && pec) {
+-		bb_error_msg_and_die("this is I2C not smbus - using PEC on I2C "
++		bb_simple_error_msg_and_die("this is I2C not smbus - using PEC on I2C "
+ 			"devices may result in data loss, aborting");
+ 	}
+ 
+ 	if (mode == I2C_SMBUS_BYTE && data_addr >= 0 && pec)
+-		bb_error_msg("WARNING! May interpret a write byte command "
++		bb_simple_error_msg("WARNING! May interpret a write byte command "
+ 			"with PEC as a write byte data command");
+ 
+ 	if (pec)
+-		bb_error_msg("PEC checking enabled");
++		bb_simple_error_msg("PEC checking enabled");
+ 
+ 	confirm_or_abort();
+ }
+@@ -507,7 +507,7 @@ int i2cget_main(int argc UNUSED_PARAM, char **argv)
+ 			case 'w':	mode = I2C_SMBUS_WORD_DATA;	break;
+ 			case 'c':	mode = I2C_SMBUS_BYTE;		break;
+ 			default:
+-				bb_error_msg("invalid mode");
++				bb_simple_error_msg("invalid mode");
+ 				bb_show_usage();
+ 			}
+ 			pec = argv[3][1] == 'p';
+@@ -529,7 +529,7 @@ int i2cget_main(int argc UNUSED_PARAM, char **argv)
+ 		if (data_addr >= 0) {
+ 			status = i2c_smbus_write_byte(fd, data_addr);
+ 			if (status < 0)
+-				bb_error_msg("warning - write failed");
++				bb_simple_error_msg("warning - write failed");
+ 		}
+ 		status = i2c_smbus_read_byte(fd);
+ 		break;
+@@ -542,7 +542,7 @@ int i2cget_main(int argc UNUSED_PARAM, char **argv)
+ 	close(fd);
+ 
+ 	if (status < 0)
+-		bb_perror_msg_and_die("read failed");
++		bb_simple_perror_msg_and_die("read failed");
+ 
+ 	printf("0x%0*x\n", mode == I2C_SMBUS_WORD_DATA ? 4 : 2, status);
+ 
+@@ -611,7 +611,7 @@ int i2cset_main(int argc, char **argv)
+ 			case 'i': mode = I2C_SMBUS_I2C_BLOCK_DATA;
+ 				break;
+ 			default:
+-				bb_error_msg("invalid mode");
++				bb_simple_error_msg("invalid mode");
+ 				bb_show_usage();
+ 			}
+ 
+@@ -620,11 +620,11 @@ int i2cset_main(int argc, char **argv)
+ 			 || mode == I2C_SMBUS_I2C_BLOCK_DATA
+ 			) {
+ 				if (pec && mode == I2C_SMBUS_I2C_BLOCK_DATA)
+-					bb_error_msg_and_die(
++					bb_simple_error_msg_and_die(
+ 						"PEC not supported for I2C "
+ 						"block writes");
+ 				if (opts & opt_m)
+-					bb_error_msg_and_die(
++					bb_simple_error_msg_and_die(
+ 						"mask not supported for block "
+ 						"writes");
+ 			}
+@@ -685,7 +685,7 @@ int i2cset_main(int argc, char **argv)
+ 		}
+ 
+ 		if (tmpval < 0)
+-			bb_perror_msg_and_die("can't read old value");
++			bb_simple_perror_msg_and_die("can't read old value");
+ 
+ 		val = (val & mask) | (tmpval & ~mask);
+ 
+@@ -724,7 +724,7 @@ int i2cset_main(int argc, char **argv)
+ 		break;
+ 	}
+ 	if (status < 0)
+-		bb_perror_msg_and_die("write failed");
++		bb_simple_perror_msg_and_die("write failed");
+ 
+ 	if (pec)
+ 		i2c_set_pec(fd, 0); /* Clear PEC. */
+@@ -978,12 +978,12 @@ int i2cdump_main(int argc UNUSED_PARAM, char **argv)
+ 		case 's': mode = I2C_SMBUS_BLOCK_DATA;		break;
+ 		case 'i': mode = I2C_SMBUS_I2C_BLOCK_DATA;	break;
+ 		default:
+-			bb_error_msg_and_die("invalid mode");
++			bb_simple_error_msg_and_die("invalid mode");
+ 		}
+ 
+ 		if (argv[2][1] == 'p') {
+ 			if (argv[2][0] == 'W' || argv[2][0] == 'i') {
+-				bb_error_msg_and_die(
++				bb_simple_error_msg_and_die(
+ 					"pec not supported for -W and -i");
+ 			} else {
+ 				pec = 1;
+@@ -994,7 +994,7 @@ int i2cdump_main(int argc UNUSED_PARAM, char **argv)
+ 	if (opts & opt_r) {
+ 		first = strtol(opt_r_str, &dash, 0);
+ 		if (dash == opt_r_str || *dash != '-' || first > 0xff)
+-			bb_error_msg_and_die("invalid range");
++			bb_simple_error_msg_and_die("invalid range");
+ 		last = xstrtou_range(++dash, 0, first, 0xff);
+ 
+ 		/* Range is not available for every mode. */
+@@ -1007,7 +1007,7 @@ int i2cdump_main(int argc UNUSED_PARAM, char **argv)
+ 				break;
+ 			/* Fall through */
+ 		default:
+-			bb_error_msg_and_die(
++			bb_simple_error_msg_and_die(
+ 				"range not compatible with selected mode");
+ 		}
+ 	}
+@@ -1032,7 +1032,7 @@ int i2cdump_main(int argc UNUSED_PARAM, char **argv)
+ 		if (mode == I2C_SMBUS_BYTE) {
+ 			res = i2c_smbus_write_byte(fd, first);
+ 			if (res < 0)
+-				bb_perror_msg_and_die("write start address");
++				bb_simple_perror_msg_and_die("write start address");
+ 		}
+ 
+ 		dump_data(fd, mode, first, last, block, blen);
+@@ -1398,7 +1398,7 @@ static void check_i2c_func(int fd)
+ 	get_funcs_matrix(fd, &funcs);
+ 
+ 	if (!(funcs & I2C_FUNC_I2C))
+-		bb_error_msg_and_die("adapter does not support I2C transfers");
++		bb_simple_error_msg_and_die("adapter does not support I2C transfers");
+ }
+ 
+ //usage:#define i2ctransfer_trivial_usage
+@@ -1451,7 +1451,7 @@ int i2ctransfer_main(int argc UNUSED_PARAM, char **argv)
+ 		char *end;
+ 
+ 		if (nmsgs >= I2C_RDWR_IOCTL_MAX_MSGS)
+-			bb_error_msg_and_die("too many messages, max: "I2C_RDWR_IOCTL_MAX_MSGS_STR);
++			bb_simple_error_msg_and_die("too many messages, max: "I2C_RDWR_IOCTL_MAX_MSGS_STR);
+ 
+ 		flags = 0;
+ 		arg_ptr = *argv;
+diff --git a/miscutils/inotifyd.c b/miscutils/inotifyd.c
+index ec0321941..8bff86ae5 100644
+--- a/miscutils/inotifyd.c
++++ b/miscutils/inotifyd.c
+@@ -117,7 +117,7 @@ int inotifyd_main(int argc, char **argv)
+ 	// open inotify
+ 	pfd.fd = inotify_init();
+ 	if (pfd.fd < 0)
+-		bb_perror_msg_and_die("no kernel support");
++		bb_simple_perror_msg_and_die("no kernel support");
+ 
+ 	// setup watches
+ 	while (*++argv) {
+diff --git a/miscutils/nandwrite.c b/miscutils/nandwrite.c
+index 09bcaaf63..f111c6363 100644
+--- a/miscutils/nandwrite.c
++++ b/miscutils/nandwrite.c
+@@ -101,7 +101,7 @@ static unsigned next_good_eraseblock(int fd, struct mtd_info_user *meminfo,
+ 
+ 		if (block_offset >= meminfo->size) {
+ 			if (IS_NANDWRITE)
+-				bb_error_msg_and_die("not enough space in MTD device");
++				bb_simple_error_msg_and_die("not enough space in MTD device");
+ 			return block_offset; /* let the caller exit */
+ 		}
+ 		offs = block_offset;
+@@ -174,7 +174,7 @@ int nandwrite_main(int argc UNUSED_PARAM, char **argv)
+ 	meminfo_writesize = meminfo.writesize;
+ 
+ 	if (mtdoffset & (meminfo_writesize - 1))
+-		bb_error_msg_and_die("start address is not page aligned");
++		bb_simple_error_msg_and_die("start address is not page aligned");
+ 
+ 	filebuf = xmalloc(meminfo_writesize);
+ 	oobbuf = xmalloc(meminfo.oobsize);
+@@ -248,9 +248,9 @@ int nandwrite_main(int argc UNUSED_PARAM, char **argv)
+ 		}
+ 		if (cnt < meminfo_writesize) {
+ 			if (IS_NANDDUMP)
+-				bb_error_msg_and_die("short read");
++				bb_simple_error_msg_and_die("short read");
+ 			if (!(opts & OPT_p))
+-				bb_error_msg_and_die("input size is not rounded up to page size, "
++				bb_simple_error_msg_and_die("input size is not rounded up to page size, "
+ 						"use -p to zero pad");
+ 			/* zero pad to end of write block */
+ 			memset(filebuf + cnt, 0, meminfo_writesize - cnt);
+@@ -273,7 +273,7 @@ int nandwrite_main(int argc UNUSED_PARAM, char **argv)
+ 		/* We filled entire MTD, but did we reach EOF on input? */
+ 		if (full_read(STDIN_FILENO, filebuf, meminfo_writesize) != 0) {
+ 			/* no */
+-			bb_error_msg_and_die("not enough space in MTD device");
++			bb_simple_error_msg_and_die("not enough space in MTD device");
+ 		}
+ 	}
+ 
+diff --git a/miscutils/rfkill.c b/miscutils/rfkill.c
+index 766bad8c7..db7c83750 100644
+--- a/miscutils/rfkill.c
++++ b/miscutils/rfkill.c
+@@ -88,7 +88,7 @@ int rfkill_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	rf_fd = device_open("/dev/rfkill", mode);
+ 	if (rf_fd < 0)
+-		bb_perror_msg_and_die("/dev/rfkill");
++		bb_simple_perror_msg_and_die("/dev/rfkill");
+ 
+ 	if (rf_opt & OPT_l) {
+ 		while (full_read(rf_fd, &event, sizeof(event)) == RFKILL_EVENT_SIZE_V1) {
+diff --git a/miscutils/rx.c b/miscutils/rx.c
+index 874a3f0a3..319ec1d49 100644
+--- a/miscutils/rx.c
++++ b/miscutils/rx.c
+@@ -120,7 +120,7 @@ static int receive(/*int read_fd, */int file_fd)
+ 		/* Write previously received block */
+ 		errno = 0;
+ 		if (full_write(file_fd, blockBuf, blockLength) != blockLength) {
+-			bb_perror_msg(bb_msg_write_error);
++			bb_simple_perror_msg(bb_msg_write_error);
+ 			goto fatal;
+ 		}
+ 
+@@ -150,7 +150,7 @@ static int receive(/*int read_fd, */int file_fd)
+ 			goto timeout;
+ 
+ 		if (blockNo != (255 - blockNoOnesCompl)) {
+-			bb_error_msg("bad block ones compl");
++			bb_simple_error_msg("bad block ones compl");
+ 			goto error;
+ 		}
+ 
+@@ -229,7 +229,7 @@ static int receive(/*int read_fd, */int file_fd)
+ 				do_crc = 0;
+ 				goto timeout;
+ 			}
+-			bb_error_msg("too many errors; giving up");
++			bb_simple_error_msg("too many errors; giving up");
+  fatal:
+ 			/* 5 CAN followed by 5 BS. Don't try too hard... */
+ 			safe_write(write_fd, "\030\030\030\030\030\010\010\010\010\010", 10);
+diff --git a/miscutils/time.c b/miscutils/time.c
+index 064888ab8..d15d363f3 100644
+--- a/miscutils/time.c
++++ b/miscutils/time.c
+@@ -88,7 +88,7 @@ static void resuse_end(pid_t pid, resource_t *resp)
+ 	 * returns the child process, set the time the command finished. */
+ 	while ((caught = wait3(&resp->waitstatus, 0, &resp->ru)) != pid) {
+ 		if (caught == -1 && errno != EINTR) {
+-			bb_perror_msg("wait");
++			bb_simple_perror_msg("wait");
+ 			return;
+ 		}
+ 	}
+diff --git a/miscutils/ubi_tools.c b/miscutils/ubi_tools.c
+index dc7af25a4..8318df0f9 100644
+--- a/miscutils/ubi_tools.c
++++ b/miscutils/ubi_tools.c
+@@ -234,10 +234,10 @@ int ubi_tools_main(int argc UNUSED_PARAM, char **argv)
+ 			//	bb_error_msg_and_die("%s invalid maximum size calculated", "UBI");
+ 		} else
+ 		if (!(opts & OPTION_s))
+-			bb_error_msg_and_die("size not specified");
++			bb_simple_error_msg_and_die("size not specified");
+ 
+ 		if (!(opts & OPTION_N))
+-			bb_error_msg_and_die("name not specified");
++			bb_simple_error_msg_and_die("name not specified");
+ 
+ 		/* the structure is memset(0) above */
+ 		mkvol_req.vol_id = vol_id;
+@@ -264,7 +264,7 @@ int ubi_tools_main(int argc UNUSED_PARAM, char **argv)
+ //usage:     "\n	-N VOLNAME	Volume name"
+ 	if (do_rmvol) {
+ 		if (!(opts & (OPTION_n|OPTION_N)))
+-			bb_error_msg_and_die("volume id not specified");
++			bb_simple_error_msg_and_die("volume id not specified");
+ 
+ 		if (opts & OPTION_N) {
+ 			unsigned num = ubi_devnum_from_devname(ubi_ctrl);
+@@ -288,9 +288,9 @@ int ubi_tools_main(int argc UNUSED_PARAM, char **argv)
+ //usage:     "\n	-s SIZE		Size in bytes"
+ 	if (do_rsvol) {
+ 		if (!(opts & OPTION_s))
+-			bb_error_msg_and_die("size not specified");
++			bb_simple_error_msg_and_die("size not specified");
+ 		if (!(opts & OPTION_n))
+-			bb_error_msg_and_die("volume id not specified");
++			bb_simple_error_msg_and_die("volume id not specified");
+ 
+ 		rsvol_req.bytes = size_bytes; /* signed int64_t */
+ 		rsvol_req.vol_id = vol_id;
+diff --git a/miscutils/ubirename.c b/miscutils/ubirename.c
+index 21bd10111..e7c56640c 100644
+--- a/miscutils/ubirename.c
++++ b/miscutils/ubirename.c
+@@ -72,7 +72,7 @@ int ubirename_main(int argc, char **argv)
+ 	rnvol = xzalloc(sizeof(*rnvol));
+ 	rnvol->count = --argc;
+ 	if (argc > ARRAY_SIZE(rnvol->ents))
+-		bb_error_msg_and_die("too many renames requested");
++		bb_simple_error_msg_and_die("too many renames requested");
+ 
+ 	ubi_devname = argv[1];
+ 	ubi_devnum = ubi_devnum_from_devname(ubi_devname);
+diff --git a/modutils/modutils-24.c b/modutils/modutils-24.c
+index 1a30dd87c..ac8632481 100644
+--- a/modutils/modutils-24.c
++++ b/modutils/modutils-24.c
+@@ -2600,7 +2600,7 @@ static void new_get_kernel_symbols(void)
+ 			module_names = xrealloc(module_names, bufsize);
+ 			goto retry_modules_load;
+ 		}
+-		bb_perror_msg_and_die("QM_MODULES");
++		bb_simple_perror_msg_and_die("QM_MODULES");
+ 	}
+ 
+ 	n_ext_modules = nmod = ret;
+@@ -2661,7 +2661,7 @@ static void new_get_kernel_symbols(void)
+ 			syms = xrealloc(syms, bufsize);
+ 			goto retry_kern_sym_load;
+ 		}
+-		bb_perror_msg_and_die("kernel: QM_SYMBOLS");
++		bb_simple_perror_msg_and_die("kernel: QM_SYMBOLS");
+ 	}
+ 	nksyms = nsyms = ret;
+ 	ksyms = syms;
+@@ -3247,21 +3247,21 @@ static struct obj_file *obj_load(char *image, size_t image_size, int loadprogbit
+ 	f->load_order_search_start = &f->load_order;
+ 
+ 	if (image_size < sizeof(f->header))
+-		bb_error_msg_and_die("error while loading ELF header");
++		bb_simple_error_msg_and_die("error while loading ELF header");
+ 	memcpy(&f->header, image, sizeof(f->header));
+ 
+ 	if (*(aliased_uint32_t*)(&f->header.e_ident) != ELFMAG_U32) {
+-		bb_error_msg_and_die("not an ELF file");
++		bb_simple_error_msg_and_die("not an ELF file");
+ 	}
+ 	if (f->header.e_ident[EI_CLASS] != ELFCLASSM
+ 	 || f->header.e_ident[EI_DATA] != (BB_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB)
+ 	 || f->header.e_ident[EI_VERSION] != EV_CURRENT
+ 	 || !MATCH_MACHINE(f->header.e_machine)
+ 	) {
+-		bb_error_msg_and_die("ELF file not for this architecture");
++		bb_simple_error_msg_and_die("ELF file not for this architecture");
+ 	}
+ 	if (f->header.e_type != ET_REL) {
+-		bb_error_msg_and_die("ELF file not a relocatable object");
++		bb_simple_error_msg_and_die("ELF file not a relocatable object");
+ 	}
+ 
+ 	/* Read the section headers.  */
+@@ -3280,7 +3280,7 @@ static struct obj_file *obj_load(char *image, size_t image_size, int loadprogbit
+ 
+ 	section_headers = alloca(sizeof(ElfW(Shdr)) * shnum);
+ 	if (image_size < f->header.e_shoff + sizeof(ElfW(Shdr)) * shnum)
+-		bb_error_msg_and_die("error while loading section headers");
++		bb_simple_error_msg_and_die("error while loading section headers");
+ 	memcpy(section_headers, image + f->header.e_shoff, sizeof(ElfW(Shdr)) * shnum);
+ 
+ 	/* Read the section data.  */
+@@ -3317,16 +3317,16 @@ static struct obj_file *obj_load(char *image, size_t image_size, int loadprogbit
+ 				if (sec->header.sh_size > 0) {
+ 					sec->contents = xmalloc(sec->header.sh_size);
+ 					if (image_size < (sec->header.sh_offset + sec->header.sh_size))
+-						bb_error_msg_and_die("error while loading section data");
++						bb_simple_error_msg_and_die("error while loading section data");
+ 					memcpy(sec->contents, image + sec->header.sh_offset, sec->header.sh_size);
+ 				}
+ 				break;
+ #if SHT_RELM == SHT_REL
+ 			case SHT_RELA:
+-				bb_error_msg_and_die("RELA relocations not supported on this architecture");
++				bb_simple_error_msg_and_die("RELA relocations not supported on this architecture");
+ #else
+ 			case SHT_REL:
+-				bb_error_msg_and_die("REL relocations not supported on this architecture");
++				bb_simple_error_msg_and_die("REL relocations not supported on this architecture");
+ #endif
+ 			default:
+ 				if (sec->header.sh_type >= SHT_LOPROC) {
+@@ -3447,7 +3447,7 @@ static int obj_load_progbits(char *image, size_t image_size, struct obj_file *f,
+ 			continue;
+ 		sec->contents = imagebase + (sec->header.sh_addr - base);
+ 		if (image_size < (sec->header.sh_offset + sec->header.sh_size)) {
+-			bb_error_msg("error reading ELF section data");
++			bb_simple_error_msg("error reading ELF section data");
+ 			return 0; /* need to delete half-loaded module! */
+ 		}
+ 		memcpy(sec->contents, image + sec->header.sh_offset, sec->header.sh_size);
+@@ -3845,7 +3845,7 @@ int FAST_FUNC bb_init_module_24(const char *m_filename, const char *options)
+ 		if (m_has_modinfo) {
+ 			int m_version = new_get_module_version(f, m_strversion);
+ 			if (m_version == -1) {
+-				bb_error_msg_and_die("can't find the kernel version "
++				bb_simple_error_msg_and_die("can't find the kernel version "
+ 					"the module was compiled for");
+ 			}
+ 		}
+@@ -3864,7 +3864,7 @@ int FAST_FUNC bb_init_module_24(const char *m_filename, const char *options)
+ #endif
+ 
+ 	if (query_module(NULL, 0, NULL, 0, NULL))
+-		bb_error_msg_and_die("old (unsupported) kernel");
++		bb_simple_error_msg_and_die("old (unsupported) kernel");
+ 	new_get_kernel_symbols();
+ 	k_crcs = new_is_kernel_checksummed();
+ 
+diff --git a/modutils/rmmod.c b/modutils/rmmod.c
+index a3548879c..8d4639f50 100644
+--- a/modutils/rmmod.c
++++ b/modutils/rmmod.c
+@@ -52,7 +52,7 @@ int rmmod_main(int argc UNUSED_PARAM, char **argv)
+ 		/* Unload _all_ unused modules via NULL delete_module() call */
+ 		err = bb_delete_module(NULL, flags);
+ 		if (err && err != EFAULT)
+-			bb_perror_msg_and_die("rmmod");
++			bb_simple_perror_msg_and_die("rmmod");
+ 		return EXIT_SUCCESS;
+ 	}
+ 
+diff --git a/networking/arp.c b/networking/arp.c
+index 71bfe3cbf..6519f8156 100644
+--- a/networking/arp.c
++++ b/networking/arp.c
+@@ -116,7 +116,7 @@ static int arp_del(char **args)
+ 	/* Resolve the host name. */
+ 	host = *args;
+ 	if (ap->input(host, &sa) < 0) {
+-		bb_herror_msg_and_die("%s", host);
++		bb_simple_herror_msg_and_die(host);
+ 	}
+ 
+ 	/* If a host has more than one address, use the correct one! */
+@@ -149,7 +149,7 @@ static int arp_del(char **args)
+ #ifdef HAVE_ATF_DONTPUB
+ 			req.arp_flags |= ATF_DONTPUB;
+ #else
+-			bb_error_msg("feature ATF_DONTPUB is not supported");
++			bb_simple_error_msg("feature ATF_DONTPUB is not supported");
+ #endif
+ 			args++;
+ 			break;
+@@ -157,7 +157,7 @@ static int arp_del(char **args)
+ #ifdef HAVE_ATF_MAGIC
+ 			req.arp_flags |= ATF_MAGIC;
+ #else
+-			bb_error_msg("feature ATF_MAGIC is not supported");
++			bb_simple_error_msg("feature ATF_MAGIC is not supported");
+ #endif
+ 			args++;
+ 			break;
+@@ -173,7 +173,7 @@ static int arp_del(char **args)
+ 			if (strcmp(*args, "255.255.255.255") != 0) {
+ 				host = *args;
+ 				if (ap->input(host, &sa) < 0) {
+-					bb_herror_msg_and_die("%s", host);
++					bb_simple_herror_msg_and_die(host);
+ 				}
+ 				memcpy(&req.arp_netmask, &sa, sizeof(struct sockaddr));
+ 				req.arp_flags |= ATF_NETMASK;
+@@ -195,7 +195,7 @@ static int arp_del(char **args)
+ 	/* Call the kernel. */
+ 	if (flags & 2) {
+ 		if (option_mask32 & ARP_OPT_v)
+-			bb_error_msg("SIOCDARP(nopub)");
++			bb_simple_error_msg("SIOCDARP(nopub)");
+ 		err = ioctl(sockfd, SIOCDARP, &req);
+ 		if (err < 0) {
+ 			if (errno == ENXIO) {
+@@ -204,20 +204,20 @@ static int arp_del(char **args)
+ 				printf("No ARP entry for %s\n", host);
+ 				return -1;
+ 			}
+-			bb_perror_msg_and_die("SIOCDARP(priv)");
++			bb_simple_perror_msg_and_die("SIOCDARP(priv)");
+ 		}
+ 	}
+ 	if ((flags & 1) && err) {
+  nopub:
+ 		req.arp_flags |= ATF_PUBL;
+ 		if (option_mask32 & ARP_OPT_v)
+-			bb_error_msg("SIOCDARP(pub)");
++			bb_simple_error_msg("SIOCDARP(pub)");
+ 		if (ioctl(sockfd, SIOCDARP, &req) < 0) {
+ 			if (errno == ENXIO) {
+ 				printf("No ARP entry for %s\n", host);
+ 				return -1;
+ 			}
+-			bb_perror_msg_and_die("SIOCDARP(pub)");
++			bb_simple_perror_msg_and_die("SIOCDARP(pub)");
+ 		}
+ 	}
+ 	return 0;
+@@ -233,7 +233,7 @@ static void arp_getdevhw(char *ifname, struct sockaddr *sa)
+ 	ioctl_or_perror_and_die(sockfd, SIOCGIFHWADDR, &ifr,
+ 					"can't get HW-Address for '%s'", ifname);
+ 	if (hw_set && (ifr.ifr_hwaddr.sa_family != hw->type)) {
+-		bb_error_msg_and_die("protocol type mismatch");
++		bb_simple_error_msg_and_die("protocol type mismatch");
+ 	}
+ 	memcpy(sa, &(ifr.ifr_hwaddr), sizeof(struct sockaddr));
+ 
+@@ -261,20 +261,20 @@ static int arp_set(char **args)
+ 
+ 	host = *args++;
+ 	if (ap->input(host, &sa) < 0) {
+-		bb_herror_msg_and_die("%s", host);
++		bb_simple_herror_msg_and_die(host);
+ 	}
+ 	/* If a host has more than one address, use the correct one! */
+ 	memcpy(&req.arp_pa, &sa, sizeof(struct sockaddr));
+ 
+ 	/* Fetch the hardware address. */
+ 	if (*args == NULL) {
+-		bb_error_msg_and_die("need hardware address");
++		bb_simple_error_msg_and_die("need hardware address");
+ 	}
+ 	if (option_mask32 & ARP_OPT_D) {
+ 		arp_getdevhw(*args++, &req.arp_ha);
+ 	} else {
+ 		if (hw->input(*args++, &req.arp_ha) < 0) {
+-			bb_error_msg_and_die("invalid hardware address");
++			bb_simple_error_msg_and_die("invalid hardware address");
+ 		}
+ 	}
+ 
+@@ -302,7 +302,7 @@ static int arp_set(char **args)
+ #ifdef HAVE_ATF_DONTPUB
+ 			flags |= ATF_DONTPUB;
+ #else
+-			bb_error_msg("feature ATF_DONTPUB is not supported");
++			bb_simple_error_msg("feature ATF_DONTPUB is not supported");
+ #endif
+ 			args++;
+ 			break;
+@@ -310,7 +310,7 @@ static int arp_set(char **args)
+ #ifdef HAVE_ATF_MAGIC
+ 			flags |= ATF_MAGIC;
+ #else
+-			bb_error_msg("feature ATF_MAGIC is not supported");
++			bb_simple_error_msg("feature ATF_MAGIC is not supported");
+ #endif
+ 			args++;
+ 			break;
+@@ -326,7 +326,7 @@ static int arp_set(char **args)
+ 			if (strcmp(*args, "255.255.255.255") != 0) {
+ 				host = *args;
+ 				if (ap->input(host, &sa) < 0) {
+-					bb_herror_msg_and_die("%s", host);
++					bb_simple_herror_msg_and_die(host);
+ 				}
+ 				memcpy(&req.arp_netmask, &sa, sizeof(struct sockaddr));
+ 				flags |= ATF_NETMASK;
+@@ -346,7 +346,7 @@ static int arp_set(char **args)
+ 
+ 	/* Call the kernel. */
+ 	if (option_mask32 & ARP_OPT_v)
+-		bb_error_msg("SIOCSARP()");
++		bb_simple_error_msg("SIOCSARP()");
+ 	xioctl(sockfd, SIOCSARP, &req);
+ 	return 0;
+ }
+@@ -422,7 +422,7 @@ static int arp_show(char *name)
+ 	if (name != NULL) {
+ 		/* Resolve the host name. */
+ 		if (ap->input(name, &sa) < 0) {
+-			bb_herror_msg_and_die("%s", name);
++			bb_simple_herror_msg_and_die(name);
+ 		}
+ 		host = xstrdup(ap->sprint(&sa, 1));
+ 	}
+@@ -530,7 +530,7 @@ int arp_main(int argc UNUSED_PARAM, char **argv)
+ 	/* Now see what we have to do here... */
+ 	if (opts & (ARP_OPT_d | ARP_OPT_s)) {
+ 		if (argv[0] == NULL)
+-			bb_error_msg_and_die("need host name");
++			bb_simple_error_msg_and_die("need host name");
+ 		if (opts & ARP_OPT_s)
+ 			return arp_set(argv);
+ 		return arp_del(argv);
+diff --git a/networking/arping.c b/networking/arping.c
+index 901578b68..2a256aaa0 100644
+--- a/networking/arping.c
++++ b/networking/arping.c
+@@ -375,7 +375,7 @@ int arping_main(int argc UNUSED_PARAM, char **argv)
+ 			xconnect(probe_fd, (struct sockaddr *) &G.probe_saddr, sizeof(G.probe_saddr));
+ 			bb_getsockname(probe_fd, (struct sockaddr *) &G.probe_saddr, sizeof(G.probe_saddr));
+ 			if (G.probe_saddr.sin_family != AF_INET)
+-				bb_error_msg_and_die("no IP address configured");
++				bb_simple_error_msg_and_die("no IP address configured");
+ 			src = G.probe_saddr.sin_addr;
+ 		}
+ 		close(probe_fd);
+@@ -430,7 +430,7 @@ int arping_main(int argc UNUSED_PARAM, char **argv)
+ 		/* Don't allow SIGALRMs while we process the reply */
+ 		sigprocmask(SIG_BLOCK, &G.sset, NULL);
+ 		if (cc < 0) {
+-			bb_perror_msg("recvfrom");
++			bb_simple_perror_msg("recvfrom");
+ 			continue;
+ 		}
+ 		recv_pack(G.packet, cc, &from);
+diff --git a/networking/dnsd.c b/networking/dnsd.c
+index f2c6bddc6..0ff0290fb 100644
+--- a/networking/dnsd.c
++++ b/networking/dnsd.c
+@@ -395,11 +395,11 @@ static int process_packet(struct dns_entry *conf_data,
+ 
+ 	head = (struct dns_head *)buf;
+ 	if (head->nquer == 0) {
+-		bb_error_msg("packet has 0 queries, ignored");
++		bb_simple_error_msg("packet has 0 queries, ignored");
+ 		return 0; /* don't reply */
+ 	}
+ 	if (head->flags & htons(0x8000)) { /* QR bit */
+-		bb_error_msg("response packet, ignored");
++		bb_simple_error_msg("response packet, ignored");
+ 		return 0; /* don't reply */
+ 	}
+ 	/* QR = 1 "response", RCODE = 4 "Not Implemented" */
+@@ -474,7 +474,7 @@ static int process_packet(struct dns_entry *conf_data,
+ 	 * RCODE = 0 "success"
+ 	 */
+ 	if (OPT_verbose)
+-		bb_info_msg("returning positive reply");
++		bb_simple_info_msg("returning positive reply");
+ 	outr_flags = htons(0x8000 | 0x0400 | 0);
+ 	/* we have one answer */
+ 	head->nansw = htons(1);
+@@ -557,7 +557,7 @@ int dnsd_main(int argc UNUSED_PARAM, char **argv)
+ 			continue;
+ 		}
+ 		if (OPT_verbose)
+-			bb_info_msg("got UDP packet");
++			bb_simple_info_msg("got UDP packet");
+ 		buf[r] = '\0'; /* paranoia */
+ 		r = process_packet(conf_data, conf_ttl, buf);
+ 		if (r <= 0)
+diff --git a/networking/ether-wake.c b/networking/ether-wake.c
+index acaac16f8..f45d43609 100644
+--- a/networking/ether-wake.c
++++ b/networking/ether-wake.c
+@@ -182,7 +182,7 @@ static int get_wol_pw(const char *ethoptarg, unsigned char *wol_passwd)
+ 		byte_cnt = sscanf(ethoptarg, "%u.%u.%u.%u",
+ 		                  &passwd[0], &passwd[1], &passwd[2], &passwd[3]);
+ 	if (byte_cnt < 4) {
+-		bb_error_msg("can't read Wake-On-LAN pass");
++		bb_simple_error_msg("can't read Wake-On-LAN pass");
+ 		return 0;
+ 	}
+ // TODO: check invalid numbers >255??
+@@ -266,7 +266,7 @@ int ether_wake_main(int argc UNUSED_PARAM, char **argv)
+ 	/* This is necessary for broadcasts to work */
+ 	if (flags /* & 1 OPT_BROADCAST */) {
+ 		if (setsockopt_broadcast(s) != 0)
+-			bb_perror_msg("SO_BROADCAST");
++			bb_simple_perror_msg("SO_BROADCAST");
+ 	}
+ 
+ #if defined(PF_PACKET)
+diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c
+index cb6910fb0..6f7f7e9ca 100644
+--- a/networking/ftpgetput.c
++++ b/networking/ftpgetput.c
+@@ -214,7 +214,7 @@ int ftp_receive(const char *local_path, char *server_path)
+ 		struct stat sbuf;
+ 		/* lstat would be wrong here! */
+ 		if (stat(local_path, &sbuf) < 0) {
+-			bb_perror_msg_and_die("stat");
++			bb_simple_perror_msg_and_die("stat");
+ 		}
+ 		if (sbuf.st_size > 0) {
+ 			beg_range = sbuf.st_size;
+diff --git a/networking/hostname.c b/networking/hostname.c
+index 248d8b65a..f96daed95 100644
+--- a/networking/hostname.c
++++ b/networking/hostname.c
+@@ -61,7 +61,7 @@ static void do_sethostname(char *s, int isfile)
+ 	} else if (sethostname(s, strlen(s))) {
+ //		if (errno == EPERM)
+ //			bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
+-		bb_perror_msg_and_die("sethostname");
++		bb_simple_perror_msg_and_die("sethostname");
+ 	}
+ }
+ 
+diff --git a/networking/httpd.c b/networking/httpd.c
+index a0a4abc10..1757e09c9 100644
+--- a/networking/httpd.c
++++ b/networking/httpd.c
+@@ -1025,7 +1025,7 @@ static void log_and_exit(void)
+ 	*/
+ 
+ 	if (verbose > 2)
+-		bb_error_msg("closed");
++		bb_simple_error_msg("closed");
+ 	_exit(xfunc_error_retval);
+ }
+ 
+@@ -1220,7 +1220,7 @@ static void send_headers(unsigned responseNum)
+ 	}
+ 	if (full_write(STDOUT_FILENO, iobuf, len) != len) {
+ 		if (verbose > 1)
+-			bb_perror_msg("error");
++			bb_simple_perror_msg("error");
+ 		log_and_exit();
+ 	}
+ }
+@@ -1838,7 +1838,7 @@ static NOINLINE void send_file_and_exit(const char *url, int what)
+ 	if (count < 0) {
+  IF_FEATURE_USE_SENDFILE(fin:)
+ 		if (verbose > 1)
+-			bb_perror_msg("error");
++			bb_simple_perror_msg("error");
+ 	}
+ 	log_and_exit();
+ }
+@@ -2149,7 +2149,7 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr)
+ 		if (rmt_ip_str)
+ 			applet_name = rmt_ip_str;
+ 		if (verbose > 2)
+-			bb_error_msg("connected");
++			bb_simple_error_msg("connected");
+ 	}
+ 	if_ip_denied_send_HTTP_FORBIDDEN_and_exit(remote_ip);
+ 
+@@ -2746,7 +2746,7 @@ int httpd_main(int argc UNUSED_PARAM, char **argv)
+ 		if (opt & OPT_SETUID) {
+ 			if (ugid.gid != (gid_t)-1) {
+ 				if (setgroups(1, &ugid.gid) == -1)
+-					bb_perror_msg_and_die("setgroups");
++					bb_simple_perror_msg_and_die("setgroups");
+ 				xsetgid(ugid.gid);
+ 			}
+ 			xsetuid(ugid.uid);
+diff --git a/networking/ifconfig.c b/networking/ifconfig.c
+index 5c47abc16..b566d91a9 100644
+--- a/networking/ifconfig.c
++++ b/networking/ifconfig.c
+@@ -361,7 +361,7 @@ int ifconfig_main(int argc UNUSED_PARAM, char **argv)
+ #if ENABLE_FEATURE_IFCONFIG_STATUS
+ 		return display_interfaces(argv[0] ? argv[0] : show_all_param);
+ #else
+-		bb_error_msg_and_die("no support for status display");
++		bb_simple_error_msg_and_die("no support for status display");
+ #endif
+ 	}
+ 
+diff --git a/networking/ifplugd.c b/networking/ifplugd.c
+index b7b26c113..fa18edd57 100644
+--- a/networking/ifplugd.c
++++ b/networking/ifplugd.c
+@@ -365,7 +365,7 @@ static void up_iface(void)
+ 	if (!(ifrequest.ifr_flags & IFF_UP)) {
+ 		ifrequest.ifr_flags |= IFF_UP;
+ 		/* Let user know we mess up with interface */
+-		bb_info_msg("upping interface");
++		bb_simple_info_msg("upping interface");
+ 		if (network_ioctl(SIOCSIFFLAGS, &ifrequest, "setting interface flags") < 0) {
+ 			if (errno != ENODEV && errno != EADDRNOTAVAIL)
+ 				xfunc_die();
+@@ -461,7 +461,7 @@ static smallint detect_link(void)
+ 		else if (option_mask32 & FLAG_IGNORE_FAIL_POSITIVE)
+ 			status = IFSTATUS_UP;
+ 		else if (G.api_mode[0] == 'a')
+-			bb_error_msg("can't detect link status");
++			bb_simple_error_msg("can't detect link status");
+ 	}
+ 
+ 	if (status != G.iface_last_status) {
+@@ -493,14 +493,14 @@ static NOINLINE int check_existence_through_netlink(void)
+ 				goto ret;
+ 			if (errno == EINTR)
+ 				continue;
+-			bb_perror_msg("netlink: recv");
++			bb_simple_perror_msg("netlink: recv");
+ 			return -1;
+ 		}
+ 
+ 		mhdr = (struct nlmsghdr*)replybuf;
+ 		while (bytes > 0) {
+ 			if (!NLMSG_OK(mhdr, bytes)) {
+-				bb_error_msg("netlink packet too small or truncated");
++				bb_simple_error_msg("netlink packet too small or truncated");
+ 				return -1;
+ 			}
+ 
+@@ -509,7 +509,7 @@ static NOINLINE int check_existence_through_netlink(void)
+ 				int attr_len;
+ 
+ 				if (mhdr->nlmsg_len < NLMSG_LENGTH(sizeof(struct ifinfomsg))) {
+-					bb_error_msg("netlink packet too small or truncated");
++					bb_simple_error_msg("netlink packet too small or truncated");
+ 					return -1;
+ 				}
+ 
+@@ -591,7 +591,7 @@ int ifplugd_main(int argc UNUSED_PARAM, char **argv)
+ 	}
+ 
+ 	if (pid_from_pidfile > 0 && kill(pid_from_pidfile, 0) == 0)
+-		bb_error_msg_and_die("daemon already running");
++		bb_simple_error_msg_and_die("daemon already running");
+ #endif
+ 
+ 	api_mode_found = strchr(api_modes, G.api_mode[0]);
+@@ -690,7 +690,7 @@ int ifplugd_main(int argc UNUSED_PARAM, char **argv)
+ 		) {
+ 			if (errno == EINTR)
+ 				continue;
+-			bb_perror_msg("poll");
++			bb_simple_perror_msg("poll");
+ 			goto exiting;
+ 		}
+ 
+@@ -763,5 +763,5 @@ int ifplugd_main(int argc UNUSED_PARAM, char **argv)
+ 
+  exiting:
+ 	remove_pidfile(pidfile_name);
+-	bb_error_msg_and_die("exiting");
++	bb_simple_error_msg_and_die("exiting");
+ }
+diff --git a/networking/ifupdown.c b/networking/ifupdown.c
+index 5327b0979..60ceb5a1f 100644
+--- a/networking/ifupdown.c
++++ b/networking/ifupdown.c
+@@ -665,7 +665,7 @@ static int FAST_FUNC dhcp_up(struct interface_defn_t *ifd, execfn *exec)
+ 		if (executable_exists(ext_dhcp_clients[i].name))
+ 			return execute(ext_dhcp_clients[i].startcmd, ifd, exec);
+ 	}
+-	bb_error_msg("no dhcp clients found");
++	bb_simple_error_msg("no dhcp clients found");
+ 	return 0;
+ }
+ # elif ENABLE_UDHCPC
+@@ -707,7 +707,7 @@ static int FAST_FUNC dhcp_down(struct interface_defn_t *ifd, execfn *exec)
+ 	}
+ 
+ 	if (!result)
+-		bb_error_msg("warning: no dhcp clients found and stopped");
++		bb_simple_error_msg("warning: no dhcp clients found and stopped");
+ 
+ 	/* Sleep a bit, otherwise static_down tries to bring down interface too soon,
+ 	   and it may come back up because udhcpc is still shutting down */
+diff --git a/networking/inetd.c b/networking/inetd.c
+index da6551174..3cd2b11f0 100644
+--- a/networking/inetd.c
++++ b/networking/inetd.c
+@@ -504,7 +504,7 @@ static void register_rpc(servtab_t *sep)
+ 
+ 	if (bb_getsockname(sep->se_fd, (struct sockaddr *) &ir_sin, sizeof(ir_sin)) < 0) {
+ //TODO: verify that such failure is even possible in Linux kernel
+-		bb_perror_msg("getsockname");
++		bb_simple_perror_msg("getsockname");
+ 		return;
+ 	}
+ 
+@@ -544,7 +544,7 @@ static void bump_nofile(void)
+ 	}
+ 
+ 	if (setrlimit(RLIMIT_NOFILE, &rl) < 0) {
+-		bb_perror_msg("setrlimit");
++		bb_simple_perror_msg("setrlimit");
+ 		return;
+ 	}
+ 
+@@ -599,7 +599,7 @@ static void prepare_socket_fd(servtab_t *sep)
+ 
+ 	fd = socket(sep->se_family, sep->se_socktype, 0);
+ 	if (fd < 0) {
+-		bb_perror_msg("socket");
++		bb_simple_perror_msg("socket");
+ 		return;
+ 	}
+ 	setsockopt_reuseaddr(fd);
+@@ -815,7 +815,7 @@ static NOINLINE servtab_t *parse_one_line(void)
+ 			n = bb_strtou(p, &p, 10);
+ 			if (n > INT_MAX) {
+  bad_ver_spec:
+-				bb_error_msg("bad rpc version");
++				bb_simple_error_msg("bad rpc version");
+ 				goto parse_err;
+ 			}
+ 			sep->se_rpcver_lo = sep->se_rpcver_hi = n;
+@@ -829,7 +829,7 @@ static NOINLINE servtab_t *parse_one_line(void)
+ 			if (*p != '\0')
+ 				goto bad_ver_spec;
+ #else
+-			bb_error_msg("no support for rpc services");
++			bb_simple_error_msg("no support for rpc services");
+ 			goto parse_err;
+ #endif
+ 		}
+@@ -1235,7 +1235,7 @@ int inetd_main(int argc UNUSED_PARAM, char **argv)
+ 	if (argv[0])
+ 		config_filename = argv[0];
+ 	if (config_filename == NULL)
+-		bb_error_msg_and_die("non-root must specify config file");
++		bb_simple_error_msg_and_die("non-root must specify config file");
+ 	if (!(opt & 2))
+ 		bb_daemonize_or_rexec(0, argv - optind);
+ 	else
+@@ -1304,7 +1304,7 @@ int inetd_main(int argc UNUSED_PARAM, char **argv)
+ 		ready_fd_cnt = select(maxsock + 1, &readable, NULL, NULL, NULL);
+ 		if (ready_fd_cnt < 0) {
+ 			if (errno != EINTR) {
+-				bb_perror_msg("select");
++				bb_simple_perror_msg("select");
+ 				sleep(1);
+ 			}
+ 			continue;
+@@ -1405,7 +1405,7 @@ int inetd_main(int argc UNUSED_PARAM, char **argv)
+ 					pid = vfork();
+ 
+ 				if (pid < 0) { /* fork error */
+-					bb_perror_msg("vfork"+1);
++					bb_simple_perror_msg("vfork"+1);
+ 					sleep(1);
+ 					restore_sigmask(&omask);
+ 					maybe_close(new_udp_fd);
+@@ -1488,7 +1488,7 @@ int inetd_main(int argc UNUSED_PARAM, char **argv)
+ 			}
+ 			if (real_uid != 0 && real_uid != pwd->pw_uid) {
+ 				/* a user running private inetd */
+-				bb_error_msg("non-root must run services as himself");
++				bb_simple_error_msg("non-root must run services as himself");
+ 				goto do_exit1;
+ 			}
+ 			if (pwd->pw_uid != real_uid) {
+@@ -1502,7 +1502,7 @@ int inetd_main(int argc UNUSED_PARAM, char **argv)
+ 			}
+ 			if (rlim_ofile.rlim_cur != rlim_ofile_cur)
+ 				if (setrlimit(RLIMIT_NOFILE, &rlim_ofile) < 0)
+-					bb_perror_msg("setrlimit");
++					bb_simple_perror_msg("setrlimit");
+ 
+ 			/* closelog(); - WRONG. we are after vfork,
+ 			 * this may confuse syslog() internal state.
+diff --git a/networking/ipcalc.c b/networking/ipcalc.c
+index 67f768836..09b146872 100644
+--- a/networking/ipcalc.c
++++ b/networking/ipcalc.c
+@@ -183,7 +183,7 @@ int ipcalc_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	if (argv[1]) {
+ 		if (ENABLE_FEATURE_IPCALC_FANCY && have_netmask) {
+-			bb_error_msg_and_die("use prefix or netmask, not both");
++			bb_simple_error_msg_and_die("use prefix or netmask, not both");
+ 		}
+ 		if (inet_aton(argv[1], &s_netmask) == 0) {
+ 			bb_error_msg_and_die("bad netmask: %s", argv[1]);
+diff --git a/networking/isrv.c b/networking/isrv.c
+index 97f5c6d4e..0e3f10f9a 100644
+--- a/networking/isrv.c
++++ b/networking/isrv.c
+@@ -185,7 +185,7 @@ static void handle_accept(isrv_state_t *state, int fd)
+ 		/* Most probably someone gave us wrong fd type
+ 		 * (for example, non-socket). Don't want
+ 		 * to loop forever. */
+-		bb_perror_msg_and_die("accept");
++		bb_simple_perror_msg_and_die("accept");
+ 	}
+ 
+ 	DPRINTF("new_peer(%d)", newfd);
+@@ -311,7 +311,7 @@ void isrv_run(
+ 
+ 		if (n < 0) {
+ 			if (errno != EINTR)
+-				bb_perror_msg("select");
++				bb_simple_perror_msg("select");
+ 			continue;
+ 		}
+ 
+diff --git a/networking/libiproute/ipaddress.c b/networking/libiproute/ipaddress.c
+index 7b7e0154b..86cf3beea 100644
+--- a/networking/libiproute/ipaddress.c
++++ b/networking/libiproute/ipaddress.c
+@@ -119,7 +119,7 @@ static NOINLINE int print_linkinfo(const struct nlmsghdr *n)
+ 	//memset(tb, 0, sizeof(tb)); - parse_rtattr does this
+ 	parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len);
+ 	if (tb[IFLA_IFNAME] == NULL) {
+-		bb_error_msg("nil ifname");
++		bb_simple_error_msg("nil ifname");
+ 		return -1;
+ 	}
+ 	if (G_filter.label
+@@ -205,7 +205,7 @@ static NOINLINE int print_linkinfo(const struct nlmsghdr *n)
+ static int flush_update(void)
+ {
+ 	if (rtnl_send_check(G_filter.rth, G_filter.flushb, G_filter.flushp) < 0) {
+-		bb_perror_msg("can't send flush request");
++		bb_simple_perror_msg("can't send flush request");
+ 		return -1;
+ 	}
+ 	G_filter.flushp = 0;
+@@ -439,7 +439,7 @@ int FAST_FUNC ipaddr_list_or_flush(char **argv, int flush)
+ 			bb_error_msg_and_die(bb_msg_requires_arg, "flush");
+ 		}
+ 		if (G_filter.family == AF_PACKET) {
+-			bb_error_msg_and_die("can't flush link addresses");
++			bb_simple_error_msg_and_die("can't flush link addresses");
+ 		}
+ 	}
+ 
+@@ -700,7 +700,7 @@ static int ipaddr_modify(int cmd, int flags, char **argv)
+ 
+ 	if (!d) {
+ 		/* There was no "dev IFACE", but we need that */
+-		bb_error_msg_and_die("need \"dev IFACE\"");
++		bb_simple_error_msg_and_die("need \"dev IFACE\"");
+ 	}
+ 	if (l && !is_prefixed_with(l, d)) {
+ 		bb_error_msg_and_die("\"dev\" (%s) must match \"label\" (%s)", d, l);
+@@ -717,7 +717,7 @@ static int ipaddr_modify(int cmd, int flags, char **argv)
+ 		inet_prefix brd;
+ 		int i;
+ 		if (req.ifa.ifa_family != AF_INET) {
+-			bb_error_msg_and_die("broadcast can be set only for IPv4 addresses");
++			bb_simple_error_msg_and_die("broadcast can be set only for IPv4 addresses");
+ 		}
+ 		brd = peer;
+ 		if (brd.bitlen <= 30) {
+diff --git a/networking/libiproute/ipneigh.c b/networking/libiproute/ipneigh.c
+index 984dd4bdd..b9b4f4b31 100644
+--- a/networking/libiproute/ipneigh.c
++++ b/networking/libiproute/ipneigh.c
+@@ -49,7 +49,7 @@ typedef struct filter_t filter_t;
+ static int flush_update(void)
+ {
+ 	if (rtnl_send_check(G_filter.rth, G_filter.flushb, G_filter.flushp) < 0) {
+-		bb_perror_msg("can't send flush request");
++		bb_simple_perror_msg("can't send flush request");
+ 		return -1;
+ 	}
+ 	G_filter.flushp = 0;
+@@ -305,7 +305,7 @@ static int FAST_FUNC ipneigh_list_or_flush(char **argv, int flush)
+ 			xrtnl_wilddump_request(&rth, G_filter.family, RTM_GETNEIGH);
+ 			G_filter.flushed = 0;
+ 			if (xrtnl_dump_filter(&rth, print_neigh, NULL) < 0) {
+-				bb_perror_msg_and_die("flush terminated");
++				bb_simple_perror_msg_and_die("flush terminated");
+ 			}
+ 			if (G_filter.flushed == 0) {
+ 				if (round == 0)
+@@ -325,11 +325,11 @@ static int FAST_FUNC ipneigh_list_or_flush(char **argv, int flush)
+ 	ndm.ndm_family = G_filter.family;
+ 
+ 	if (rtnl_dump_request(&rth, RTM_GETNEIGH, &ndm, sizeof(struct ndmsg)) < 0) {
+-		bb_perror_msg_and_die("can't send dump request");
++		bb_simple_perror_msg_and_die("can't send dump request");
+ 	}
+ 
+ 	if (xrtnl_dump_filter(&rth, print_neigh, NULL) < 0) {
+-		bb_error_msg_and_die("dump terminated");
++		bb_simple_error_msg_and_die("dump terminated");
+ 	}
+ 
+ 	return 0;
+diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c
+index b11078ed5..5a972f8b2 100644
+--- a/networking/libiproute/iproute.c
++++ b/networking/libiproute/iproute.c
+@@ -57,7 +57,7 @@ typedef struct filter_t filter_t;
+ static int flush_update(void)
+ {
+ 	if (rtnl_send_check(G_filter.rth, G_filter.flushb, G_filter.flushp) < 0) {
+-		bb_perror_msg("can't send flush request");
++		bb_simple_perror_msg("can't send flush request");
+ 		return -1;
+ 	}
+ 	G_filter.flushp = 0;
+@@ -756,7 +756,7 @@ static void iproute_flush_cache(void)
+ 	}
+ 
+ 	if (write(flush_fd, "-1", 2) < 2) {
+-		bb_perror_msg("can't flush routing cache");
++		bb_simple_perror_msg("can't flush routing cache");
+ 		return;
+ 	}
+ 	close(flush_fd);
+@@ -948,7 +948,7 @@ static int iproute_list_or_flush(char **argv, int flush)
+ 	if (G_filter.tb != -1) {
+ 		xrtnl_wilddump_request(&rth, do_ipv6, RTM_GETROUTE);
+ 	} else if (rtnl_rtcache_request(&rth, do_ipv6) < 0) {
+-		bb_perror_msg_and_die("can't send dump request");
++		bb_simple_perror_msg_and_die("can't send dump request");
+ 	}
+ 	xrtnl_dump_filter(&rth, print_route, NULL);
+ 
+@@ -1041,7 +1041,7 @@ static int iproute_get(char **argv)
+ 	}
+ 
+ 	if (req.r.rtm_dst_len == 0) {
+-		bb_error_msg_and_die("need at least destination address");
++		bb_simple_error_msg_and_die("need at least destination address");
+ 	}
+ 
+ 	xrtnl_open(&rth);
+@@ -1077,7 +1077,7 @@ static int iproute_get(char **argv)
+ 		print_route(NULL, &req.n, NULL);
+ 
+ 		if (req.n.nlmsg_type != RTM_NEWROUTE) {
+-			bb_error_msg_and_die("not a route?");
++			bb_simple_error_msg_and_die("not a route?");
+ 		}
+ 		len -= NLMSG_LENGTH(sizeof(*r));
+ 		if (len < 0) {
+@@ -1091,7 +1091,7 @@ static int iproute_get(char **argv)
+ 			tb[RTA_PREFSRC]->rta_type = RTA_SRC;
+ 			r->rtm_src_len = 8*RTA_PAYLOAD(tb[RTA_PREFSRC]);
+ 		} else if (!tb[RTA_SRC]) {
+-			bb_error_msg_and_die("can't connect the route");
++			bb_simple_error_msg_and_die("can't connect the route");
+ 		}
+ 		if (!odev && tb[RTA_OIF]) {
+ 			tb[RTA_OIF]->rta_type = 0;
+diff --git a/networking/libiproute/iptunnel.c b/networking/libiproute/iptunnel.c
+index 4002feb78..c9fa632f3 100644
+--- a/networking/libiproute/iptunnel.c
++++ b/networking/libiproute/iptunnel.c
+@@ -338,7 +338,7 @@ static void parse_args(char **argv, int cmd, struct ip_tunnel_parm *p)
+ 
+ 	if (p->iph.protocol == IPPROTO_IPIP || p->iph.protocol == IPPROTO_IPV6) {
+ 		if ((p->i_flags & GRE_KEY) || (p->o_flags & GRE_KEY)) {
+-			bb_error_msg_and_die("keys are not allowed with ipip and sit");
++			bb_simple_error_msg_and_die("keys are not allowed with ipip and sit");
+ 		}
+ 	}
+ 
+@@ -355,7 +355,7 @@ static void parse_args(char **argv, int cmd, struct ip_tunnel_parm *p)
+ 		p->o_flags |= GRE_KEY;
+ 	}
+ 	if (IN_MULTICAST(ntohl(p->iph.daddr)) && !p->iph.saddr) {
+-		bb_error_msg_and_die("broadcast tunnel requires a source address");
++		bb_simple_error_msg_and_die("broadcast tunnel requires a source address");
+ 	}
+ }
+ 
+@@ -367,7 +367,7 @@ static int do_add(int cmd, char **argv)
+ 	parse_args(argv, cmd, &p);
+ 
+ 	if (p.iph.ttl && p.iph.frag_off == 0) {
+-		bb_error_msg_and_die("ttl != 0 and noptmudisc are incompatible");
++		bb_simple_error_msg_and_die("ttl != 0 and noptmudisc are incompatible");
+ 	}
+ 
+ 	switch (p.iph.protocol) {
+@@ -378,7 +378,7 @@ static int do_add(int cmd, char **argv)
+ 	case IPPROTO_IPV6:
+ 		return do_add_ioctl(cmd, "sit0", &p);
+ 	default:
+-		bb_error_msg_and_die("can't determine tunnel mode (ipip, gre or sit)");
++		bb_simple_error_msg_and_die("can't determine tunnel mode (ipip, gre or sit)");
+ 	}
+ }
+ 
+@@ -485,7 +485,7 @@ static void do_tunnels_list(struct ip_tunnel_parm *p)
+ 		if (ptr == NULL ||
+ 		    (*ptr++ = 0, sscanf(buf, "%s", name) != 1)
+ 		) {
+-			bb_error_msg("wrong format of /proc/net/dev");
++			bb_simple_error_msg("wrong format of /proc/net/dev");
+ 			return;
+ 		}
+ 		if (sscanf(ptr, "%lu%lu%lu%lu%lu%lu%lu%*d%lu%lu%lu%lu%lu%lu%lu",
+diff --git a/networking/libiproute/libnetlink.c b/networking/libiproute/libnetlink.c
+index b0d4166ac..7e3473a1c 100644
+--- a/networking/libiproute/libnetlink.c
++++ b/networking/libiproute/libnetlink.c
+@@ -79,7 +79,7 @@ int FAST_FUNC rtnl_send_check(struct rtnl_handle *rth, const void *buf, int len)
+ 		if (h->nlmsg_type == NLMSG_ERROR) {
+ 			struct nlmsgerr *err = (struct nlmsgerr*)NLMSG_DATA(h);
+ 			if (h->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr)))
+-				bb_error_msg("ERROR truncated");
++				bb_simple_error_msg("ERROR truncated");
+ 			else
+ 				errno = -err->error;
+ 			return -1;
+@@ -149,11 +149,11 @@ static int rtnl_dump_filter(struct rtnl_handle *rth,
+ 		if (status < 0) {
+ 			if (errno == EINTR)
+ 				continue;
+-			bb_perror_msg("OVERRUN");
++			bb_simple_perror_msg("OVERRUN");
+ 			continue;
+ 		}
+ 		if (status == 0) {
+-			bb_error_msg("EOF on netlink");
++			bb_simple_error_msg("EOF on netlink");
+ 			goto ret;
+ 		}
+ 		if (msg.msg_namelen != sizeof(nladdr)) {
+@@ -184,10 +184,10 @@ static int rtnl_dump_filter(struct rtnl_handle *rth,
+ 			if (h->nlmsg_type == NLMSG_ERROR) {
+ 				struct nlmsgerr *l_err = (struct nlmsgerr*)NLMSG_DATA(h);
+ 				if (h->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr))) {
+-					bb_error_msg("ERROR truncated");
++					bb_simple_error_msg("ERROR truncated");
+ 				} else {
+ 					errno = -l_err->error;
+-					bb_perror_msg("RTNETLINK answers");
++					bb_simple_perror_msg("RTNETLINK answers");
+ 				}
+ 				goto ret;
+ 			}
+@@ -201,7 +201,7 @@ static int rtnl_dump_filter(struct rtnl_handle *rth,
+ 			h = NLMSG_NEXT(h, status);
+ 		}
+ 		if (msg.msg_flags & MSG_TRUNC) {
+-			bb_error_msg("message truncated");
++			bb_simple_error_msg("message truncated");
+ 			continue;
+ 		}
+ 		if (status) {
+@@ -221,7 +221,7 @@ int FAST_FUNC xrtnl_dump_filter(struct rtnl_handle *rth,
+ {
+ 	int ret = rtnl_dump_filter(rth, filter, arg1/*, NULL, NULL*/);
+ 	if (ret < 0)
+-		bb_error_msg_and_die("dump terminated");
++		bb_simple_error_msg_and_die("dump terminated");
+ 	return ret;
+ }
+ 
+@@ -266,7 +266,7 @@ int FAST_FUNC rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 	status = sendmsg(rtnl->fd, &msg, 0);
+ 
+ 	if (status < 0) {
+-		bb_perror_msg("can't talk to rtnetlink");
++		bb_simple_perror_msg("can't talk to rtnetlink");
+ 		goto ret;
+ 	}
+ 
+@@ -280,11 +280,11 @@ int FAST_FUNC rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 			if (errno == EINTR) {
+ 				continue;
+ 			}
+-			bb_perror_msg("OVERRUN");
++			bb_simple_perror_msg("OVERRUN");
+ 			continue;
+ 		}
+ 		if (status == 0) {
+-			bb_error_msg("EOF on netlink");
++			bb_simple_error_msg("EOF on netlink");
+ 			goto ret;
+ 		}
+ 		if (msg.msg_namelen != sizeof(nladdr)) {
+@@ -297,7 +297,7 @@ int FAST_FUNC rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 
+ 			if (l < 0 || len > status) {
+ 				if (msg.msg_flags & MSG_TRUNC) {
+-					bb_error_msg("truncated message");
++					bb_simple_error_msg("truncated message");
+ 					goto ret;
+ 				}
+ 				bb_error_msg_and_die("malformed message: len=%d!", len);
+@@ -320,7 +320,7 @@ int FAST_FUNC rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 			if (h->nlmsg_type == NLMSG_ERROR) {
+ 				struct nlmsgerr *err = (struct nlmsgerr*)NLMSG_DATA(h);
+ 				if (l < (int)sizeof(struct nlmsgerr)) {
+-					bb_error_msg("ERROR truncated");
++					bb_simple_error_msg("ERROR truncated");
+ 				} else {
+ 					errno = - err->error;
+ 					if (errno == 0) {
+@@ -329,7 +329,7 @@ int FAST_FUNC rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 						}
+ 						goto ret_0;
+ 					}
+-					bb_perror_msg("RTNETLINK answers");
++					bb_simple_perror_msg("RTNETLINK answers");
+ 				}
+ 				goto ret;
+ 			}
+@@ -338,13 +338,13 @@ int FAST_FUNC rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
+ 				goto ret_0;
+ 			}
+ 
+-			bb_error_msg("unexpected reply!");
++			bb_simple_error_msg("unexpected reply!");
+ 
+ 			status -= NLMSG_ALIGN(len);
+ 			h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len));
+ 		}
+ 		if (msg.msg_flags & MSG_TRUNC) {
+-			bb_error_msg("message truncated");
++			bb_simple_error_msg("message truncated");
+ 			continue;
+ 		}
+ 		if (status) {
+diff --git a/networking/libiproute/utils.c b/networking/libiproute/utils.c
+index bf053a54b..4ce230356 100644
+--- a/networking/libiproute/utils.c
++++ b/networking/libiproute/utils.c
+@@ -230,7 +230,7 @@ uint32_t FAST_FUNC get_addr32(char *name)
+ char** FAST_FUNC next_arg(char **argv)
+ {
+ 	if (!*++argv)
+-		bb_error_msg_and_die("command line is not complete, try \"help\"");
++		bb_simple_error_msg_and_die("command line is not complete, try \"help\"");
+ 	return argv;
+ }
+ 
+diff --git a/networking/nbd-client.c b/networking/nbd-client.c
+index 0dc8d0c43..3db3b46f9 100644
+--- a/networking/nbd-client.c
++++ b/networking/nbd-client.c
+@@ -179,7 +179,7 @@ int nbdclient_main(int argc, char **argv)
+ 		if (memcmp(&nbd_header.magic1, "NBDMAGIC",
+ 				sizeof(nbd_header.magic1)) != 0
+ 		) {
+-			bb_error_msg_and_die("login failed");
++			bb_simple_error_msg_and_die("login failed");
+ 		}
+ 		if (memcmp(&nbd_header.magic2,
+ 				"\x00\x00\x42\x02\x81\x86\x12\x53",
+@@ -189,7 +189,7 @@ int nbdclient_main(int argc, char **argv)
+ 		} else if (memcmp(&nbd_header.magic2, "IHAVEOPT", 8) == 0) {
+ 			proto_new = 1;
+ 		} else {
+-			bb_error_msg_and_die("login failed");
++			bb_simple_error_msg_and_die("login failed");
+ 		}
+ 
+ 		if (!proto_new) {
+@@ -240,17 +240,17 @@ int nbdclient_main(int argc, char **argv)
+ 		}
+ 
+ 		if (ioctl(nbd, BLKROSET, &ro) < 0) {
+-			bb_perror_msg_and_die("BLKROSET");
++			bb_simple_perror_msg_and_die("BLKROSET");
+ 		}
+ 
+ 		if (timeout) {
+ 			if (ioctl(nbd, NBD_SET_TIMEOUT, (unsigned long) timeout)) {
+-				bb_perror_msg_and_die("NBD_SET_TIMEOUT");
++				bb_simple_perror_msg_and_die("NBD_SET_TIMEOUT");
+ 			}
+ 		}
+ 
+ 		if (ioctl(nbd, NBD_SET_SOCK, sock)) {
+-			bb_perror_msg_and_die("NBD_SET_SOCK");
++			bb_simple_perror_msg_and_die("NBD_SET_SOCK");
+ 		}
+ 
+ 		//if (swap) mlockall(MCL_CURRENT|MCL_FUTURE);
+diff --git a/networking/nc.c b/networking/nc.c
+index b208f46c6..705b7356a 100644
+--- a/networking/nc.c
++++ b/networking/nc.c
+@@ -112,7 +112,7 @@
+ 
+ static void timeout(int signum UNUSED_PARAM)
+ {
+-	bb_error_msg_and_die("timed out");
++	bb_simple_error_msg_and_die("timed out");
+ }
+ 
+ int nc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+@@ -211,7 +211,7 @@ int nc_main(int argc, char **argv)
+  accept_again:
+ 			cfd = accept(sfd, NULL, 0);
+ 			if (cfd < 0)
+-				bb_perror_msg_and_die("accept");
++				bb_simple_perror_msg_and_die("accept");
+ 			if (!execparam)
+ 				close(sfd);
+ 		} else {
+@@ -260,7 +260,7 @@ int nc_main(int argc, char **argv)
+ 		int nread;
+ 
+ 		if (safe_poll(pfds, 2, -1) < 0)
+-			bb_perror_msg_and_die("poll");
++			bb_simple_perror_msg_and_die("poll");
+ 
+ 		fdidx = 0;
+ 		while (1) {
+diff --git a/networking/nc_bloaty.c b/networking/nc_bloaty.c
+index 42c84de45..034e03d21 100644
+--- a/networking/nc_bloaty.c
++++ b/networking/nc_bloaty.c
+@@ -198,8 +198,8 @@ enum {
+ #define Debug(...) do { } while (0)
+ #endif
+ 
+-#define holler_error(...)  do { if (o_verbose) bb_error_msg(__VA_ARGS__); } while (0)
+-#define holler_perror(...) do { if (o_verbose) bb_perror_msg(__VA_ARGS__); } while (0)
++#define holler_error(msg)  do { if (o_verbose) bb_simple_error_msg(msg); } while (0)
++#define holler_perror(msg) do { if (o_verbose) bb_simple_perror_msg(msg); } while (0)
+ 
+ /* catch: no-brainer interrupt handler */
+ static void catch(int sig)
+@@ -361,10 +361,10 @@ static void dolisten(int is_persistent, char **proggie)
+ 			rr = recv_from_to(netfd, NULL, 0, MSG_PEEK, /*was bigbuf_net, BIGSIZ*/
+ 				&remend.u.sa, &ouraddr->u.sa, ouraddr->len);
+ 			if (rr < 0)
+-				bb_perror_msg_and_die("recvfrom");
++				bb_simple_perror_msg_and_die("recvfrom");
+ 			unarm();
+ 		} else
+-			bb_error_msg_and_die("timeout");
++			bb_simple_error_msg_and_die("timeout");
+ /* Now we learned *to which IP* peer has connected, and we want to anchor
+ our socket on it, so that our outbound packets will have correct local IP.
+ Unfortunately, bind() on already bound socket will fail now (EINVAL):
+@@ -382,7 +382,7 @@ create new one, and bind() it. TODO */
+ 			remend.len = LSA_SIZEOF_SA;
+ 			rr = accept(netfd, &remend.u.sa, &remend.len);
+ 			if (rr < 0)
+-				bb_perror_msg_and_die("accept");
++				bb_simple_perror_msg_and_die("accept");
+ 			if (themaddr) {
+ 				int sv_port, port, r;
+ 
+@@ -409,7 +409,7 @@ create new one, and bind() it. TODO */
+ 			}
+ 			unarm();
+ 		} else
+-			bb_error_msg_and_die("timeout");
++			bb_simple_error_msg_and_die("timeout");
+ 
+ 		if (is_persistent && proggie) {
+ 			/* -l -k -e PROG */
+@@ -494,7 +494,7 @@ static int udptest(void)
+ 
+ 	rr = write(netfd, bigbuf_in, 1);
+ 	if (rr != 1)
+-		bb_perror_msg("udptest first write");
++		bb_simple_perror_msg("udptest first write");
+ 
+ 	if (o_wait)
+ 		sleep(o_wait); // can be interrupted! while (t) nanosleep(&t)?
+@@ -644,7 +644,7 @@ static int readwrite(void)
+ 			if (rr <= 0) {
+ 				if (rr < 0 && o_verbose > 1) {
+ 					/* nc 1.10 doesn't do this */
+-					bb_perror_msg("net read");
++					bb_simple_perror_msg("net read");
+ 				}
+ 				pfds[1].fd = -1;                   /* don't poll for netfd anymore */
+ 				fds_open--;
+@@ -869,7 +869,7 @@ int nc_main(int argc UNUSED_PARAM, char **argv)
+ 		/* apparently UDP can listen ON "port 0",
+ 		 but that's not useful */
+ 		if (!o_lport)
+-			bb_error_msg_and_die("UDP listen needs nonzero -p port");
++			bb_simple_error_msg_and_die("UDP listen needs nonzero -p port");
+ 	}
+ #endif
+ 
+diff --git a/networking/netstat.c b/networking/netstat.c
+index f6bcd44ba..29b891cdc 100644
+--- a/networking/netstat.c
++++ b/networking/netstat.c
+@@ -343,9 +343,9 @@ static void prg_cache_load(void)
+ 		return;
+ 
+ 	if (prg_cache_loaded == 1)
+-		bb_error_msg("can't scan /proc - are you root?");
++		bb_simple_error_msg("can't scan /proc - are you root?");
+ 	else
+-		bb_error_msg("showing only processes with your user ID");
++		bb_simple_error_msg("showing only processes with your user ID");
+ }
+ 
+ #else
+diff --git a/networking/nslookup.c b/networking/nslookup.c
+index 24e09d4f0..8adde14b8 100644
+--- a/networking/nslookup.c
++++ b/networking/nslookup.c
+@@ -549,7 +549,7 @@ static int send_queries(struct ns *ns)
+ 
+ 		recvlen = read(pfd.fd, reply, sizeof(reply));
+ 		if (recvlen < 0) {
+-			bb_perror_msg("read");
++			bb_simple_perror_msg("read");
+  next:
+ 			tcur = monotonic_ms();
+ 			continue;
+diff --git a/networking/ntpd.c b/networking/ntpd.c
+index d55b070c5..2700cf515 100644
+--- a/networking/ntpd.c
++++ b/networking/ntpd.c
+@@ -905,7 +905,7 @@ do_sendto(int fd,
+ 		ret = send_to_from(fd, msg, len, MSG_DONTWAIT, to, from, addrlen);
+ 	}
+ 	if (ret != len) {
+-		bb_perror_msg("send failed");
++		bb_simple_perror_msg("send failed");
+ 		return -1;
+ 	}
+ 	return 0;
+@@ -1121,7 +1121,7 @@ step_time(double offset)
+ 	dtime = tvc.tv_sec + (1.0e-6 * tvc.tv_usec) + offset;
+ 	d_to_tv(dtime, &tvn);
+ 	if (settimeofday(&tvn, NULL) == -1)
+-		bb_perror_msg_and_die("settimeofday");
++		bb_simple_perror_msg_and_die("settimeofday");
+ 
+ 	VERB2 {
+ 		tval = tvc.tv_sec;
+@@ -1494,7 +1494,7 @@ select_and_cluster(void)
+ 		/* Starting from 1 is ok here */
+ 		for (i = 1; i < num_survivors; i++) {
+ 			if (G.last_update_peer == survivor[i].p) {
+-				VERB5 bb_error_msg("keeping old synced peer");
++				VERB5 bb_simple_error_msg("keeping old synced peer");
+ 				p = G.last_update_peer;
+ 				goto keep_old;
+ 			}
+@@ -1702,7 +1702,7 @@ update_local_clock(peer_t *p)
+ #else
+ 			set_new_values(STATE_SYNC, offset, recv_time);
+ #endif
+-			VERB4 bb_error_msg("transitioning to FREQ, datapoint ignored");
++			VERB4 bb_simple_error_msg("transitioning to FREQ, datapoint ignored");
+ 			return 0; /* "leave poll interval as is" */
+ 
+ #if 0 /* this is dead code for now */
+@@ -1796,7 +1796,7 @@ update_local_clock(peer_t *p)
+ 	VERB4 {
+ 		memset(&tmx, 0, sizeof(tmx));
+ 		if (adjtimex(&tmx) < 0)
+-			bb_perror_msg_and_die("adjtimex");
++			bb_simple_perror_msg_and_die("adjtimex");
+ 		bb_error_msg("p adjtimex freq:%ld offset:%+ld status:0x%x tc:%ld",
+ 				tmx.freq, tmx.offset, tmx.status, tmx.constant);
+ 	}
+@@ -1906,7 +1906,7 @@ update_local_clock(peer_t *p)
+ 	//tmx.maxerror = (uint32_t)((sys_rootdelay / 2 + sys_rootdisp) * 1e6);
+ 	rc = adjtimex(&tmx);
+ 	if (rc < 0)
+-		bb_perror_msg_and_die("adjtimex");
++		bb_simple_perror_msg_and_die("adjtimex");
+ 	/* NB: here kernel returns constant == G.poll_exp, not == G.poll_exp - 4.
+ 	 * Not sure why. Perhaps it is normal.
+ 	 */
+@@ -2248,7 +2248,7 @@ recv_and_process_client_pkt(void /*int fd*/)
+ 		if (size < 0) {
+ 			if (errno == EAGAIN)
+ 				goto bail;
+-			bb_perror_msg_and_die("recv");
++			bb_simple_perror_msg_and_die("recv");
+ 		}
+ 		addr = xmalloc_sockaddr2dotted_noport(from);
+ 		bb_error_msg("malformed packet received from %s: size %u", addr, (int)size);
+@@ -2415,7 +2415,7 @@ static NOINLINE void ntp_init(char **argv)
+ 	srand(getpid());
+ 
+ 	if (getuid())
+-		bb_error_msg_and_die(bb_msg_you_must_be_root);
++		bb_simple_error_msg_and_die(bb_msg_you_must_be_root);
+ 
+ 	/* Set some globals */
+ 	G.discipline_jitter = G_precision_sec;
+@@ -2491,7 +2491,7 @@ static NOINLINE void ntp_init(char **argv)
+ 				/* supports 'sha' and 'sha1' formats */
+ 				hash_type = HASH_SHA1;
+ 			else
+-				bb_error_msg_and_die("only MD5 and SHA1 keys supported");
++				bb_simple_error_msg_and_die("only MD5 and SHA1 keys supported");
+ /* man ntp.keys:
+  *  MD5    The key is 1 to 16 printable characters terminated by an EOL,
+  *         whitespace, or a # (which is the "start of comment" character).
+@@ -2674,7 +2674,7 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv)
+ 				if (p->p_fd == -1) {
+ 					/* Time to send new req */
+ 					if (--cnt == 0) {
+-						VERB4 bb_error_msg("disabling burst mode");
++						VERB4 bb_simple_error_msg("disabling burst mode");
+ 						G.polladj_count = 0;
+ 						G.poll_exp = MINPOLL;
+ 					}
+diff --git a/networking/ping.c b/networking/ping.c
+index b534c74c7..a47342fee 100644
+--- a/networking/ping.c
++++ b/networking/ping.c
+@@ -184,8 +184,8 @@ create_icmp_socket(void)
+ 		sock = socket(AF_INET, SOCK_RAW, 1); /* 1 == ICMP */
+ 	if (sock < 0) {
+ 		if (errno == EPERM)
+-			bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
+-		bb_perror_msg_and_die(bb_msg_can_not_create_raw_socket);
++			bb_simple_error_msg_and_die(bb_msg_perm_denied_are_you_root);
++		bb_simple_perror_msg_and_die(bb_msg_can_not_create_raw_socket);
+ 	}
+ 
+ 	xmove_fd(sock, pingsock);
+@@ -235,7 +235,7 @@ static void ping4(len_and_sockaddr *lsa)
+ #endif
+ 		if (c < 0) {
+ 			if (errno != EINTR)
+-				bb_perror_msg("recvfrom");
++				bb_simple_perror_msg("recvfrom");
+ 			continue;
+ 		}
+ 		if (c >= 76) {			/* ip + icmp */
+@@ -280,7 +280,7 @@ static void ping6(len_and_sockaddr *lsa)
+ #endif
+ 		if (c < 0) {
+ 			if (errno != EINTR)
+-				bb_perror_msg("recvfrom");
++				bb_simple_perror_msg("recvfrom");
+ 			continue;
+ 		}
+ 		if (c >= ICMP_MINLEN) {	/* icmp6_hdr */
+@@ -482,7 +482,7 @@ static void sendping_tail(void (*sp)(int), int size_pkt)
+ 	 * it doesn't matter */
+ 	sz = xsendto(pingsock, G.snd_packet, size_pkt, &pingaddr.sa, sizeof(pingaddr));
+ 	if (sz != size_pkt)
+-		bb_error_msg_and_die(bb_msg_write_error);
++		bb_simple_error_msg_and_die(bb_msg_write_error);
+ 
+ 	if (pingcount == 0 || G.ntransmitted < pingcount) {
+ 		/* Didn't send all pings yet - schedule next in -i SEC interval */
+@@ -723,7 +723,7 @@ static void ping4(len_and_sockaddr *lsa)
+ 	if (source_lsa) {
+ 		if (setsockopt(pingsock, IPPROTO_IP, IP_MULTICAST_IF,
+ 				&source_lsa->u.sa, source_lsa->len))
+-			bb_error_msg_and_die("can't set multicast source interface");
++			bb_simple_error_msg_and_die("can't set multicast source interface");
+ 		xbind(pingsock, &source_lsa->u.sa, source_lsa->len);
+ 	}
+ 
+@@ -757,7 +757,7 @@ static void ping4(len_and_sockaddr *lsa)
+ 				(struct sockaddr *) &from, &fromlen);
+ 		if (c < 0) {
+ 			if (errno != EINTR)
+-				bb_perror_msg("recvfrom");
++				bb_simple_perror_msg("recvfrom");
+ 			continue;
+ 		}
+ 		c = unpack4(G.rcv_packet, c, &from);
+@@ -838,7 +838,7 @@ static void ping6(len_and_sockaddr *lsa)
+ 		c = recvmsg(pingsock, &msg, 0);
+ 		if (c < 0) {
+ 			if (errno != EINTR)
+-				bb_perror_msg("recvfrom");
++				bb_simple_perror_msg("recvfrom");
+ 			continue;
+ 		}
+ 		for (mp = CMSG_FIRSTHDR(&msg); mp; mp = CMSG_NXTHDR(&msg, mp)) {
+diff --git a/networking/route.c b/networking/route.c
+index ac1d94c28..a5d8d7cb9 100644
+--- a/networking/route.c
++++ b/networking/route.c
+@@ -336,7 +336,7 @@ static NOINLINE void INET_setroute(int action, char **args)
+ 		}
+ 		mask = ((struct sockaddr_in *) &rt->rt_dst)->sin_addr.s_addr;
+ 		if (mask & ~(uint32_t)mask_in_addr(*rt)) {
+-			bb_error_msg_and_die("netmask and route address conflict");
++			bb_simple_error_msg_and_die("netmask and route address conflict");
+ 		}
+ 	}
+ 
+@@ -532,7 +532,7 @@ void FAST_FUNC bb_displayroutes(int noresolve, int netstatfmt)
+ 			if ((r < 0) && feof(fp)) { /* EOF with no (nonspace) chars read. */
+ 				break;
+ 			}
+-			bb_perror_msg_and_die(bb_msg_read_error);
++			bb_simple_perror_msg_and_die(bb_msg_read_error);
+ 		}
+ 
+ 		if (!(flgs & RTF_UP)) { /* Skip interfaces that are down. */
+@@ -598,7 +598,7 @@ static void INET6_displayroutes(void)
+ 				break;
+ 			}
+  ERROR:
+-			bb_perror_msg_and_die(bb_msg_read_error);
++			bb_simple_perror_msg_and_die(bb_msg_read_error);
+ 		}
+ 
+ 		/* Do the addr6x shift-and-insert changes to ':'-delimit addresses.
+diff --git a/networking/slattach.c b/networking/slattach.c
+index c6feca248..659822a91 100644
+--- a/networking/slattach.c
++++ b/networking/slattach.c
+@@ -56,7 +56,7 @@ static int tcsetattr_serial_or_warn(struct termios *state)
+ 
+ 	ret = tcsetattr(serial_fd, TCSANOW, state);
+ 	if (ret != 0) {
+-		bb_perror_msg("tcsetattr");
++		bb_simple_perror_msg("tcsetattr");
+ 		return 1; /* used as exitcode */
+ 	}
+ 	return ret; /* 0 */
+@@ -159,7 +159,7 @@ int slattach_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	/* Save current tty state */
+ 	if (tcgetattr(serial_fd, &G.saved_state) != 0)
+-		bb_perror_msg_and_die("tcgetattr");
++		bb_simple_perror_msg_and_die("tcgetattr");
+ 	/* Save line discipline */
+ 	xioctl(serial_fd, TIOCGETD, &G.saved_disc);
+ 
+diff --git a/networking/tcpudp.c b/networking/tcpudp.c
+index a0af64981..8c4afabf6 100644
+--- a/networking/tcpudp.c
++++ b/networking/tcpudp.c
+@@ -325,7 +325,7 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv)
+ 	client = 0;
+ 	if ((getuid() == 0) && !(opts & OPT_u)) {
+ 		xfunc_error_retval = 100;
+-		bb_error_msg_and_die(bb_msg_you_must_be_root);
++		bb_simple_error_msg_and_die(bb_msg_you_must_be_root);
+ 	}
+ 	if (opts & OPT_u)
+ 		if (!uidgid_get(&sslugid, ssluser, 1)) {
+@@ -419,7 +419,7 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv)
+ 	sig_block(SIGCHLD);
+ 	if (conn < 0) {
+ 		if (errno != EINTR)
+-			bb_perror_msg(tcp ? "accept" : "recv");
++			bb_simple_perror_msg(tcp ? "accept" : "recv");
+ 		goto again2;
+ 	}
+ 	xmove_fd(tcp ? conn : sock, 0);
+@@ -484,7 +484,7 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	pid = vfork();
+ 	if (pid == -1) {
+-		bb_perror_msg("vfork");
++		bb_simple_perror_msg("vfork");
+ 		goto again;
+ 	}
+ 
+diff --git a/networking/telnetd.c b/networking/telnetd.c
+index 6abecbde2..29f805de7 100644
+--- a/networking/telnetd.c
++++ b/networking/telnetd.c
+@@ -495,7 +495,7 @@ make_new_session(
+ 		free(ts);
+ 		close(fd);
+ 		/* sock will be closed by caller */
+-		bb_perror_msg("vfork");
++		bb_simple_perror_msg("vfork");
+ 		return NULL;
+ 	}
+ 	if (pid > 0) {
+diff --git a/networking/tftp.c b/networking/tftp.c
+index d551c861f..04bfe844f 100644
+--- a/networking/tftp.c
++++ b/networking/tftp.c
+@@ -453,7 +453,7 @@ static int tftp_protocol(
+ 		/* fill in packet if the filename fits into xbuf */
+ 		len = strlen(remote_file) + 1;
+ 		if (2 + len + sizeof("octet") >= io_bufsize) {
+-			bb_error_msg("remote filename is too long");
++			bb_simple_error_msg("remote filename is too long");
+ 			goto ret;
+ 		}
+ 		strcpy(cp, remote_file);
+@@ -468,7 +468,7 @@ static int tftp_protocol(
+ 
+ 		/* Need to add option to pkt */
+ 		if ((&xbuf[io_bufsize - 1] - cp) < sizeof("blksize NNNNN tsize ") + sizeof(off_t)*3) {
+-			bb_error_msg("remote filename is too long");
++			bb_simple_error_msg("remote filename is too long");
+ 			goto ret;
+ 		}
+ 		expect_OACK = 1;
+@@ -569,7 +569,7 @@ static int tftp_protocol(
+ 			retries--;
+ 			if (retries == 0) {
+ 				tftp_progress_done();
+-				bb_error_msg("timeout");
++				bb_simple_error_msg("timeout");
+ 				goto ret; /* no err packet sent */
+ 			}
+ 
+@@ -674,7 +674,7 @@ static int tftp_protocol(
+ 			 * must be ignored by the client and server
+ 			 * as if it were never requested." */
+ 			if (blksize != TFTP_BLKSIZE_DEFAULT)
+-				bb_error_msg("falling back to blocksize "TFTP_BLKSIZE_DEFAULT_STR);
++				bb_simple_error_msg("falling back to blocksize "TFTP_BLKSIZE_DEFAULT_STR);
+ 			blksize = TFTP_BLKSIZE_DEFAULT;
+ 			io_bufsize = TFTP_BLKSIZE_DEFAULT + 4;
+ 		}
+@@ -739,7 +739,7 @@ static int tftp_protocol(
+ 	strcpy(G_error_pkt_str, bb_msg_read_error);
+  send_err_pkt:
+ 	if (G_error_pkt_str[0])
+-		bb_error_msg("%s", G_error_pkt_str);
++		bb_simple_error_msg(G_error_pkt_str);
+ 	G.error_pkt[1] = TFTP_ERROR;
+ 	xsendto(socket_fd, G.error_pkt, 4 + 1 + strlen(G_error_pkt_str),
+ 			&peer_lsa->u.sa, peer_lsa->len);
+diff --git a/networking/tls.c b/networking/tls.c
+index db7be07f3..854937302 100644
+--- a/networking/tls.c
++++ b/networking/tls.c
+@@ -446,7 +446,7 @@ static void hmac_begin(hmac_precomputed_t *pre, uint8_t *key, unsigned key_size,
+ 	// than INSIZE bytes will first hash the key using H and then use the
+ 	// resultant OUTSIZE byte string as the actual key to HMAC."
+ 	if (key_size > SHA_INSIZE) {
+-		bb_error_msg_and_die("HMAC key>64"); //does not happen (yet?)
++		bb_simple_error_msg_and_die("HMAC key>64"); //does not happen (yet?)
+ //		md5sha_ctx_t ctx;
+ //		begin(&ctx);
+ //		md5sha_hash(&ctx, key, key_size);
+@@ -1132,7 +1132,7 @@ static int tls_xread_record(tls_state_t *tls, const char *expected)
+ 		}
+ 	}
+ 	if (sz < 0)
+-		bb_error_msg_and_die("encrypted data too short");
++		bb_simple_error_msg_and_die("encrypted data too short");
+ 
+ 	//dump_hex("<< %s\n", tls->inbuf, RECHDR_LEN + sz);
+ 
+@@ -1411,7 +1411,7 @@ static void find_key_in_der_cert(tls_state_t *tls, uint8_t *der, int len)
+ 			dbg("ECDSA key\n");
+ 			//UNUSED: tls->flags |= GOT_CERT_ECDSA_KEY_ALG;
+ 		} else
+-			bb_error_msg_and_die("not RSA or ECDSA cert");
++			bb_simple_error_msg_and_die("not RSA or ECDSA cert");
+ 	}
+ 
+ 	if (tls->flags & GOT_CERT_RSA_KEY_ALG) {
+@@ -1882,7 +1882,7 @@ static void process_server_key(tls_state_t *tls, int len)
+ 	/* So far we only support curve_x25519 */
+ 	move_from_unaligned32(t32, keybuf);
+ 	if (t32 != htonl(0x03001d20))
+-		bb_error_msg_and_die("elliptic curve is not x25519");
++		bb_simple_error_msg_and_die("elliptic curve is not x25519");
+ 
+ 	memcpy(tls->hsd->ecc_pub_key32, keybuf + 4, 32);
+ 	tls->flags |= GOT_EC_KEY;
+@@ -1929,7 +1929,7 @@ static void send_client_key_exchange(tls_state_t *tls)
+ 	if (!(tls->flags & NEED_EC_KEY)) {
+ 		/* RSA */
+ 		if (!(tls->flags & GOT_CERT_RSA_KEY_ALG))
+-			bb_error_msg("server cert is not RSA");
++			bb_simple_error_msg("server cert is not RSA");
+ 
+ 		tls_get_random(rsa_premaster, sizeof(rsa_premaster));
+ 		if (TLS_DEBUG_FIXED_SECRETS)
+@@ -1959,7 +1959,7 @@ static void send_client_key_exchange(tls_state_t *tls)
+ 		uint8_t privkey[CURVE25519_KEYSIZE]; //[32]
+ 
+ 		if (!(tls->flags & GOT_EC_KEY))
+-			bb_error_msg("server did not provide EC key");
++			bb_simple_error_msg("server did not provide EC key");
+ 
+ 		/* Generate random private key, see RFC 7748 */
+ 		tls_get_random(privkey, sizeof(privkey));
+@@ -2322,7 +2322,7 @@ void FAST_FUNC tls_run_copy_loop(tls_state_t *tls, unsigned flags)
+ 		int nread;
+ 
+ 		if (safe_poll(pfds, 2, -1) < 0)
+-			bb_perror_msg_and_die("poll");
++			bb_simple_perror_msg_and_die("poll");
+ 
+ 		if (pfds[0].revents) {
+ 			void *buf;
+diff --git a/networking/tls.h b/networking/tls.h
+index 494ed78c4..d4ac1bef8 100644
+--- a/networking/tls.h
++++ b/networking/tls.h
+@@ -90,7 +90,7 @@ void xorbuf_aligned_AES_BLOCK_SIZE(void* buf, const void* mask) FAST_FUNC;
+ #define matrixCryptoGetPrngData(buf, len, userPtr) (tls_get_random(buf, len), PS_SUCCESS)
+ 
+ #define psFree(p, pool)    free(p)
+-#define psTraceCrypto(...) bb_error_msg_and_die(__VA_ARGS__)
++#define psTraceCrypto(msg) bb_simple_error_msg_and_die(msg)
+ 
+ /* Secure zerofill */
+ #define memset_s(A,B,C,D) memset((A),(C),(D))
+diff --git a/networking/traceroute.c b/networking/traceroute.c
+index bdf451186..0435d6ba6 100644
+--- a/networking/traceroute.c
++++ b/networking/traceroute.c
+@@ -875,7 +875,7 @@ common_traceroute_main(int op, char **argv)
+ 		 * probe (e.g., on a multi-homed host).
+ 		 */
+ 		if (getuid() != 0)
+-			bb_error_msg_and_die(bb_msg_you_must_be_root);
++			bb_simple_error_msg_and_die(bb_msg_you_must_be_root);
+ 	}
+ 	if (op & OPT_WAITTIME)
+ 		waittime = xatou_range(waittime_str, 1, 24 * 60 * 60);
+@@ -1003,7 +1003,7 @@ common_traceroute_main(int op, char **argv)
+ 		if (af == AF_INET)
+ 			if (setsockopt(sndsock, IPPROTO_IP, IP_MULTICAST_IF,
+ 					&source_lsa->u.sa, source_lsa->len))
+-				bb_error_msg_and_die("can't set multicast source interface");
++				bb_simple_error_msg_and_die("can't set multicast source interface");
+ //TODO: we can query source port we bound to,
+ // and check it in replies... if we care enough
+ 		xbind(sndsock, &source_lsa->u.sa, source_lsa->len);
+@@ -1025,7 +1025,7 @@ common_traceroute_main(int op, char **argv)
+ 		/* read IP and port */
+ 		source_lsa = get_sock_lsa(probe_fd);
+ 		if (source_lsa == NULL)
+-			bb_error_msg_and_die("can't get probe addr");
++			bb_simple_error_msg_and_die("can't get probe addr");
+ 
+ 		close(probe_fd);
+ 
+diff --git a/networking/udhcp/arpping.c b/networking/udhcp/arpping.c
+index 215d023ce..a395e838d 100644
+--- a/networking/udhcp/arpping.c
++++ b/networking/udhcp/arpping.c
+@@ -53,12 +53,12 @@ int FAST_FUNC arpping(uint32_t test_nip,
+ 
+ 	s = socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ARP));
+ 	if (s == -1) {
+-		bb_perror_msg(bb_msg_can_not_create_raw_socket);
++		bb_simple_perror_msg(bb_msg_can_not_create_raw_socket);
+ 		return -1;
+ 	}
+ 
+ 	if (setsockopt_broadcast(s) == -1) {
+-		bb_perror_msg("can't enable bcast on raw socket");
++		bb_simple_perror_msg("can't enable bcast on raw socket");
+ 		goto ret;
+ 	}
+ 
+diff --git a/networking/udhcp/common.c b/networking/udhcp/common.c
+index 62ad248ce..4a452cdb9 100644
+--- a/networking/udhcp/common.c
++++ b/networking/udhcp/common.c
+@@ -240,7 +240,7 @@ uint8_t* FAST_FUNC udhcp_get_option(struct dhcp_packet *packet, int code)
+ 	while (1) {
+ 		if (rem <= 0) {
+  complain:
+-			bb_error_msg("bad packet, malformed option field");
++			bb_simple_error_msg("bad packet, malformed option field");
+ 			return NULL;
+ 		}
+ 
+diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h
+index bba3d6037..60255eefa 100644
+--- a/networking/udhcp/common.h
++++ b/networking/udhcp/common.h
+@@ -267,26 +267,45 @@ struct option_set *udhcp_find_option(struct option_set *opt_list, uint8_t code)
+ # define IF_UDHCP_VERBOSE(...) __VA_ARGS__
+ extern unsigned dhcp_verbose;
+ # define log1(...) do { if (dhcp_verbose >= 1) bb_info_msg(__VA_ARGS__); } while (0)
++# define log1s(msg) do { if (dhcp_verbose >= 1) bb_simple_info_msg(msg); } while (0)
+ # if CONFIG_UDHCP_DEBUG >= 2
+ void udhcp_dump_packet(struct dhcp_packet *packet) FAST_FUNC;
+ #  define log2(...) do { if (dhcp_verbose >= 2) bb_info_msg(__VA_ARGS__); } while (0)
++#  define log2s(msg) do { if (dhcp_verbose >= 2) bb_simple_info_msg(msg); } while (0)
+ # else
+ #  define udhcp_dump_packet(...) ((void)0)
+ #  define log2(...) ((void)0)
++#  define log2s(msg) ((void)0)
+ # endif
+ # if CONFIG_UDHCP_DEBUG >= 3
+ #  define log3(...) do { if (dhcp_verbose >= 3) bb_info_msg(__VA_ARGS__); } while (0)
++#  define log3s(msg) do { if (dhcp_verbose >= 3) bb_simple_info_msg(msg); } while (0)
+ # else
+ #  define log3(...) ((void)0)
++#  define log3s(msg) ((void)0)
+ # endif
+ #else
+ # define IF_UDHCP_VERBOSE(...)
+ # define udhcp_dump_packet(...) ((void)0)
+ # define log1(...) ((void)0)
++# define log1s(msg) ((void)0)
+ # define log2(...) ((void)0)
++# define log2s(msg) ((void)0)
+ # define log3(...) ((void)0)
++# define log3s(msg) ((void)0)
+ #endif
+ 
++#if defined(__mips__)
++/*
++ * The 'simple' message functions have a negative impact on the size of the
++ * DHCP code when compiled for MIPS, so don't use them in this case.
++ */
++#define bb_simple_info_msg bb_info_msg
++#define bb_simple_error_msg bb_error_msg
++#define bb_simple_perror_msg_and_die bb_perror_msg_and_die
++#undef log1s
++#define log1s log1
++#endif
+ 
+ /*** Other shared functions ***/
+ 
+diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c
+index 4eb7ae1c1..9d8e17c51 100644
+--- a/networking/udhcp/d6_dhcpc.c
++++ b/networking/udhcp/d6_dhcpc.c
+@@ -235,7 +235,7 @@ static char *string_option_to_env(const uint8_t *option,
+  found:
+ 	val_len = (option[2] << 8) | option[3];
+ 	if (val_len + &option[D6_OPT_DATA] > option_end) {
+-		bb_error_msg("option data exceeds option length");
++		bb_simple_error_msg("option data exceeds option length");
+ 		return NULL;
+ 	}
+ 	return xasprintf("%s=%.*s", name, val_len, (char*)option + 4);
+@@ -848,19 +848,19 @@ static NOINLINE int d6_recv_raw_packet(struct in6_addr *peer_ipv6, struct d6_pac
+ 
+ 	bytes = safe_read(fd, &packet, sizeof(packet));
+ 	if (bytes < 0) {
+-		log1("packet read error, ignoring");
++		log1s("packet read error, ignoring");
+ 		/* NB: possible down interface, etc. Caller should pause. */
+ 		return bytes; /* returns -1 */
+ 	}
+ 
+ 	if (bytes < (int) (sizeof(packet.ip6) + sizeof(packet.udp))) {
+-		log1("packet is too short, ignoring");
++		log1s("packet is too short, ignoring");
+ 		return -2;
+ 	}
+ 
+ 	if (bytes < sizeof(packet.ip6) + ntohs(packet.ip6.ip6_plen)) {
+ 		/* packet is bigger than sizeof(packet), we did partial read */
+-		log1("oversized packet, ignoring");
++		log1s("oversized packet, ignoring");
+ 		return -2;
+ 	}
+ 
+@@ -874,7 +874,7 @@ static NOINLINE int d6_recv_raw_packet(struct in6_addr *peer_ipv6, struct d6_pac
+ 	/* || bytes > (int) sizeof(packet) - can't happen */
+ 	 || packet.udp.len != packet.ip6.ip6_plen
+ 	) {
+-		log1("unrelated/bogus packet, ignoring");
++		log1s("unrelated/bogus packet, ignoring");
+ 		return -2;
+ 	}
+ 
+@@ -1003,7 +1003,7 @@ static int d6_raw_socket(int ifindex)
+ 	}
+ #endif
+ 
+-	log1("created raw socket");
++	log1s("created raw socket");
+ 
+ 	return fd;
+ }
+@@ -1031,7 +1031,7 @@ static void change_listen_mode(int new_mode)
+ /* Called only on SIGUSR1 */
+ static void perform_renew(void)
+ {
+-	bb_info_msg("performing DHCP renew");
++	bb_simple_info_msg("performing DHCP renew");
+ 	switch (client_data.state) {
+ 	case BOUND:
+ 		change_listen_mode(LISTEN_KERNEL);
+@@ -1059,10 +1059,10 @@ static void perform_d6_release(struct in6_addr *server_ipv6, struct in6_addr *ou
+ 	 || client_data.state == REBINDING
+ 	 || client_data.state == RENEW_REQUESTED
+ 	) {
+-		bb_info_msg("unicasting a release");
++		bb_simple_info_msg("unicasting a release");
+ 		send_d6_release(server_ipv6, our_cur_ipv6); /* unicast */
+ 	}
+-	bb_info_msg("entering released state");
++	bb_simple_info_msg("entering released state");
+ /*
+  * We can be here on: SIGUSR2,
+  * or on exit (SIGTERM) and -R "release on quit" is specified.
+@@ -1275,7 +1275,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
+ 	/* Create pidfile */
+ 	write_pidfile(client_data.pidfile);
+ 	/* Goes to stdout (unless NOMMU) and possibly syslog */
+-	bb_info_msg("started, v"BB_VER);
++	bb_simple_info_msg("started, v"BB_VER);
+ 
+ 	client_data.state = INIT_SELECTING;
+ 	d6_run_script_no_option("deconfig");
+@@ -1321,7 +1321,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
+ 					continue;
+ 				}
+ 				/* Else: an error occured, panic! */
+-				bb_perror_msg_and_die("poll");
++				bb_simple_perror_msg_and_die("poll");
+ 			}
+ 		}
+ 
+@@ -1362,7 +1362,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
+ 				d6_run_script_no_option("leasefail");
+ #if BB_MMU /* -b is not supported on NOMMU */
+ 				if (opt & OPT_b) { /* background if no lease */
+-					bb_info_msg("no lease, forking to background");
++					bb_simple_info_msg("no lease, forking to background");
+ 					client_background();
+ 					/* do not background again! */
+ 					opt = ((opt & ~(OPT_b|OPT_n)) | OPT_f);
+@@ -1375,7 +1375,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
+ 				} else
+ #endif
+ 				if (opt & OPT_n) { /* abort if no lease */
+-					bb_info_msg("no lease, failing");
++					bb_simple_info_msg("no lease, failing");
+ 					retval = 1;
+ 					goto ret;
+ 				}
+@@ -1403,7 +1403,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
+ 				client_data.state = RENEWING;
+ 				client_data.first_secs = 0; /* make secs field count from 0 */
+ 				change_listen_mode(LISTEN_KERNEL);
+-				log1("entering renew state");
++				log1s("entering renew state");
+ 				/* fall right through */
+ 			case RENEW_REQUESTED: /* manual (SIGUSR1) renew */
+ 			case_RENEW_REQUESTED:
+@@ -1423,7 +1423,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
+ 					continue;
+ 				}
+ 				/* Timed out, enter rebinding state */
+-				log1("entering rebinding state");
++				log1s("entering rebinding state");
+ 				client_data.state = REBINDING;
+ 				/* fall right through */
+ 			case REBINDING:
+@@ -1438,7 +1438,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
+ 					continue;
+ 				}
+ 				/* Timed out, enter init state */
+-				bb_info_msg("lease lost, entering init state");
++				bb_simple_info_msg("lease lost, entering init state");
+ 				d6_run_script_no_option("deconfig");
+ 				client_data.state = INIT_SELECTING;
+ 				client_data.first_secs = 0; /* make secs field count from 0 */
+@@ -1560,7 +1560,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
+ 				}
+ 				option = d6_copy_option(packet.d6_options, packet_end, D6_OPT_SERVERID);
+ 				if (!option) {
+-					bb_info_msg("no server ID, ignoring packet");
++					bb_simple_info_msg("no server ID, ignoring packet");
+ 					continue;
+ 					/* still selecting - this server looks bad */
+ 				}
+diff --git a/networking/udhcp/d6_packet.c b/networking/udhcp/d6_packet.c
+index 01d1c930b..446497e15 100644
+--- a/networking/udhcp/d6_packet.c
++++ b/networking/udhcp/d6_packet.c
+@@ -35,12 +35,12 @@ int FAST_FUNC d6_recv_kernel_packet(struct in6_addr *peer_ipv6
+ 	memset(packet, 0, sizeof(*packet));
+ 	bytes = safe_read(fd, packet, sizeof(*packet));
+ 	if (bytes < 0) {
+-		log1("packet read error, ignoring");
++		log1s("packet read error, ignoring");
+ 		return bytes; /* returns -1 */
+ 	}
+ 
+ 	if (bytes < offsetof(struct d6_packet, d6_options)) {
+-		bb_info_msg("packet with bad magic, ignoring");
++		bb_simple_info_msg("packet with bad magic, ignoring");
+ 		return -2;
+ 	}
+ 	log1("received %s", "a packet");
+diff --git a/networking/udhcp/d6_socket.c b/networking/udhcp/d6_socket.c
+index 25e622d6f..8ddee5a8e 100644
+--- a/networking/udhcp/d6_socket.c
++++ b/networking/udhcp/d6_socket.c
+@@ -115,7 +115,7 @@ int FAST_FUNC d6_listen_socket(int port, const char *inf)
+ 
+ 	setsockopt_reuseaddr(fd);
+ 	if (setsockopt_broadcast(fd) == -1)
+-		bb_perror_msg_and_die("SO_BROADCAST");
++		bb_simple_perror_msg_and_die("SO_BROADCAST");
+ 
+ 	/* NB: bug 1032 says this doesn't work on ethernet aliases (ethN:M) */
+ 	if (setsockopt_bindtodevice(fd, inf))
+diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
+index d1a0eaf02..656295ff7 100644
+--- a/networking/udhcp/dhcpc.c
++++ b/networking/udhcp/dhcpc.c
+@@ -906,7 +906,7 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd)
+ 		if (bytes < 0) {
+ 			if (errno == EINTR)
+ 				continue;
+-			log1("packet read error, ignoring");
++			log1s("packet read error, ignoring");
+ 			/* NB: possible down interface, etc. Caller should pause. */
+ 			return bytes; /* returns -1 */
+ 		}
+@@ -914,13 +914,13 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd)
+ 	}
+ 
+ 	if (bytes < (int) (sizeof(packet.ip) + sizeof(packet.udp))) {
+-		log1("packet is too short, ignoring");
++		log1s("packet is too short, ignoring");
+ 		return -2;
+ 	}
+ 
+ 	if (bytes < ntohs(packet.ip.tot_len)) {
+ 		/* packet is bigger than sizeof(packet), we did partial read */
+-		log1("oversized packet, ignoring");
++		log1s("oversized packet, ignoring");
+ 		return -2;
+ 	}
+ 
+@@ -935,7 +935,7 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd)
+ 	/* || bytes > (int) sizeof(packet) - can't happen */
+ 	 || ntohs(packet.udp.len) != (uint16_t)(bytes - sizeof(packet.ip))
+ 	) {
+-		log1("unrelated/bogus packet, ignoring");
++		log1s("unrelated/bogus packet, ignoring");
+ 		return -2;
+ 	}
+ 
+@@ -943,7 +943,7 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd)
+ 	check = packet.ip.check;
+ 	packet.ip.check = 0;
+ 	if (check != inet_cksum((uint16_t *)&packet.ip, sizeof(packet.ip))) {
+-		log1("bad IP header checksum, ignoring");
++		log1s("bad IP header checksum, ignoring");
+ 		return -2;
+ 	}
+ 
+@@ -968,13 +968,13 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd)
+ 	check = packet.udp.check;
+ 	packet.udp.check = 0;
+ 	if (check && check != inet_cksum((uint16_t *)&packet, bytes)) {
+-		log1("packet with bad UDP checksum received, ignoring");
++		log1s("packet with bad UDP checksum received, ignoring");
+ 		return -2;
+ 	}
+  skip_udp_sum_check:
+ 
+ 	if (packet.data.cookie != htonl(DHCP_MAGIC)) {
+-		bb_info_msg("packet with bad magic, ignoring");
++		bb_simple_info_msg("packet with bad magic, ignoring");
+ 		return -2;
+ 	}
+ 
+@@ -1089,10 +1089,10 @@ static int udhcp_raw_socket(int ifindex)
+ 
+ 	if (setsockopt_1(fd, SOL_PACKET, PACKET_AUXDATA) != 0) {
+ 		if (errno != ENOPROTOOPT)
+-			log1("can't set PACKET_AUXDATA on raw socket");
++			log1s("can't set PACKET_AUXDATA on raw socket");
+ 	}
+ 
+-	log1("created raw socket");
++	log1s("created raw socket");
+ 
+ 	return fd;
+ }
+@@ -1120,7 +1120,7 @@ static void change_listen_mode(int new_mode)
+ /* Called only on SIGUSR1 */
+ static void perform_renew(void)
+ {
+-	bb_info_msg("performing DHCP renew");
++	bb_simple_info_msg("performing DHCP renew");
+ 	switch (client_data.state) {
+ 	case BOUND:
+ 		change_listen_mode(LISTEN_KERNEL);
+@@ -1158,7 +1158,7 @@ static void perform_release(uint32_t server_addr, uint32_t requested_ip)
+ 				inet_ntoa(temp_addr), buffer);
+ 		send_release(server_addr, requested_ip); /* unicast */
+ 	}
+-	bb_info_msg("entering released state");
++	bb_simple_info_msg("entering released state");
+ /*
+  * We can be here on: SIGUSR2,
+  * or on exit (SIGTERM) and -R "release on quit" is specified.
+@@ -1303,7 +1303,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 	);
+ 	if (opt & (OPT_h|OPT_H)) {
+ 		//msg added 2011-11
+-		bb_error_msg("option -h NAME is deprecated, use -x hostname:NAME");
++		bb_simple_error_msg("option -h NAME is deprecated, use -x hostname:NAME");
+ 		client_data.hostname = alloc_dhcp_option(DHCP_HOST_NAME, str_h, 0);
+ 	}
+ 	if (opt & OPT_F) {
+@@ -1397,7 +1397,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 	/* Create pidfile */
+ 	write_pidfile(client_data.pidfile);
+ 	/* Goes to stdout (unless NOMMU) and possibly syslog */
+-	bb_info_msg("started, v"BB_VER);
++	bb_simple_info_msg("started, v"BB_VER);
+ 	/* We want random_xid to be random... */
+ 	srand(monotonic_us());
+ 
+@@ -1444,7 +1444,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 					continue;
+ 				}
+ 				/* Else: an error occurred, panic! */
+-				bb_perror_msg_and_die("poll");
++				bb_simple_perror_msg_and_die("poll");
+ 			}
+ 		}
+ 
+@@ -1485,7 +1485,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 				udhcp_run_script(NULL, "leasefail");
+ #if BB_MMU /* -b is not supported on NOMMU */
+ 				if (opt & OPT_b) { /* background if no lease */
+-					bb_info_msg("no lease, forking to background");
++					bb_simple_info_msg("no lease, forking to background");
+ 					client_background();
+ 					/* do not background again! */
+ 					opt = ((opt & ~(OPT_b|OPT_n)) | OPT_f);
+@@ -1498,7 +1498,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 				} else
+ #endif
+ 				if (opt & OPT_n) { /* abort if no lease */
+-					bb_info_msg("no lease, failing");
++					bb_simple_info_msg("no lease, failing");
+ 					retval = 1;
+ 					goto ret;
+ 				}
+@@ -1526,7 +1526,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 				client_data.state = RENEWING;
+ 				client_data.first_secs = 0; /* make secs field count from 0 */
+ 				change_listen_mode(LISTEN_KERNEL);
+-				log1("entering renew state");
++				log1s("entering renew state");
+ 				/* fall right through */
+ 			case RENEW_REQUESTED: /* manual (SIGUSR1) renew */
+ 			case_RENEW_REQUESTED:
+@@ -1559,7 +1559,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 					 */
+ 				}
+ 				/* Timed out or error, enter rebinding state */
+-				log1("entering rebinding state");
++				log1s("entering rebinding state");
+ 				client_data.state = REBINDING;
+ 				/* fall right through */
+ 			case REBINDING:
+@@ -1574,7 +1574,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 					continue;
+ 				}
+ 				/* Timed out, enter init state */
+-				bb_info_msg("lease lost, entering init state");
++				bb_simple_info_msg("lease lost, entering init state");
+ 				udhcp_run_script(NULL, "deconfig");
+ 				client_data.state = INIT_SELECTING;
+ 				client_data.first_secs = 0; /* make secs field count from 0 */
+@@ -1660,13 +1660,13 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 		 || memcmp(packet.chaddr, client_data.client_mac, 6) != 0
+ 		) {
+ //FIXME: need to also check that last 10 bytes are zero
+-			log1("chaddr does not match, ignoring packet"); // log2?
++			log1("chaddr does not match%s", ", ignoring packet"); // log2?
+ 			continue;
+ 		}
+ 
+ 		message = udhcp_get_option(&packet, DHCP_MESSAGE_TYPE);
+ 		if (message == NULL) {
+-			bb_info_msg("no message type option, ignoring packet");
++			bb_info_msg("no message type option%s", ", ignoring packet");
+ 			continue;
+ 		}
+ 
+@@ -1703,7 +1703,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 				server_addr = 0;
+ 				temp = udhcp_get_option32(&packet, DHCP_SERVER_ID);
+ 				if (!temp) {
+-					bb_info_msg("no server ID, using 0.0.0.0");
++					bb_simple_info_msg("no server ID, using 0.0.0.0");
+ 				} else {
+ 					/* it IS unaligned sometimes, don't "optimize" */
+ 					move_from_unaligned32(server_addr, temp);
+@@ -1730,7 +1730,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 				temp = udhcp_get_option32(&packet, DHCP_LEASE_TIME);
+ 				if (!temp) {
+-					bb_info_msg("no lease time with ACK, using 1 hour lease");
++					bb_simple_info_msg("no lease time with ACK, using 1 hour lease");
+ 					lease_seconds = 60 * 60;
+ 				} else {
+ 					/* it IS unaligned sometimes, don't "optimize" */
+@@ -1763,7 +1763,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 							client_data.interface,
+ 							arpping_ms)
+ 					) {
+-						bb_info_msg("offered address is in use "
++						bb_simple_info_msg("offered address is in use "
+ 							"(got ARP reply), declining");
+ 						send_decline(/*xid,*/ server_addr, packet.yiaddr);
+ 
+@@ -1827,7 +1827,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
+ 					if (!temp) {
+  non_matching_svid:
+ 						log1("received DHCP NAK with wrong"
+-							" server ID, ignoring packet");
++							" server ID%s", ", ignoring packet");
+ 						continue;
+ 					}
+ 					move_from_unaligned32(svid, temp);
+diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c
+index 022b8721b..3e08ec011 100644
+--- a/networking/udhcp/dhcpd.c
++++ b/networking/udhcp/dhcpd.c
+@@ -582,11 +582,11 @@ static void send_packet_to_client(struct dhcp_packet *dhcp_pkt, int force_broadc
+ 	 || (dhcp_pkt->flags & htons(BROADCAST_FLAG))
+ 	 || dhcp_pkt->ciaddr == 0
+ 	) {
+-		log1("broadcasting packet to client");
++		log1s("broadcasting packet to client");
+ 		ciaddr = INADDR_BROADCAST;
+ 		chaddr = MAC_BCAST_ADDR;
+ 	} else {
+-		log1("unicasting packet to client ciaddr");
++		log1s("unicasting packet to client ciaddr");
+ 		ciaddr = dhcp_pkt->ciaddr;
+ 		chaddr = dhcp_pkt->chaddr;
+ 	}
+@@ -600,7 +600,7 @@ static void send_packet_to_client(struct dhcp_packet *dhcp_pkt, int force_broadc
+ /* Send a packet to gateway_nip using the kernel ip stack */
+ static void send_packet_to_relay(struct dhcp_packet *dhcp_pkt)
+ {
+-	log1("forwarding packet to relay");
++	log1s("forwarding packet to relay");
+ 
+ 	udhcp_send_kernel_packet(dhcp_pkt,
+ 			server_data.server_nip, SERVER_PORT,
+@@ -754,7 +754,7 @@ static NOINLINE void send_offer(struct dhcp_packet *oldpacket,
+ 		}
+ 
+ 		if (!packet.yiaddr) {
+-			bb_error_msg("no free IP addresses. OFFER abandoned");
++			bb_simple_error_msg("no free IP addresses. OFFER abandoned");
+ 			return;
+ 		}
+ 		/* Reserve the IP for a short time hoping to get DHCPREQUEST soon */
+@@ -765,7 +765,7 @@ static NOINLINE void send_offer(struct dhcp_packet *oldpacket,
+ 				p_host_name ? (unsigned char)p_host_name[OPT_LEN - OPT_DATA] : 0
+ 		);
+ 		if (!lease) {
+-			bb_error_msg("no free IP addresses. OFFER abandoned");
++			bb_simple_error_msg("no free IP addresses. OFFER abandoned");
+ 			return;
+ 		}
+ 	}
+@@ -914,7 +914,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
+ 	write_pidfile(server_data.pidfile);
+ 	/* if (!..) bb_perror_msg("can't create pidfile %s", pidfile); */
+ 
+-	bb_info_msg("started, v"BB_VER);
++	bb_simple_info_msg("started, v"BB_VER);
+ 
+ 	option = udhcp_find_option(server_data.options, DHCP_LEASE_TIME);
+ 	server_data.max_lease_sec = DEFAULT_LEASE_TIME;
+@@ -985,7 +985,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
+ 			if (errno == EINTR)
+ 				goto new_tv;
+ 			/* < 0 and not EINTR: should not happen */
+-			bb_perror_msg_and_die("poll");
++			bb_simple_perror_msg_and_die("poll");
+ 		}
+ 
+ 		if (pfds[0].revents) switch (udhcp_sp_read()) {
+@@ -1019,16 +1019,16 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
+ 			continue;
+ 		}
+ 		if (packet.hlen != 6) {
+-			bb_info_msg("MAC length != 6, ignoring packet");
++			bb_info_msg("MAC length != 6%s", ", ignoring packet");
+ 			continue;
+ 		}
+ 		if (packet.op != BOOTREQUEST) {
+-			bb_info_msg("not a REQUEST, ignoring packet");
++			bb_info_msg("not a REQUEST%s", ", ignoring packet");
+ 			continue;
+ 		}
+ 		state = udhcp_get_option(&packet, DHCP_MESSAGE_TYPE);
+ 		if (state == NULL || state[0] < DHCP_MINTYPE || state[0] > DHCP_MAXTYPE) {
+-			bb_info_msg("no or bad message type option, ignoring packet");
++			bb_info_msg("no or bad message type option%s", ", ignoring packet");
+ 			continue;
+ 		}
+ 
+@@ -1039,7 +1039,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
+ 			move_from_unaligned32(server_id_network_order, server_id_opt);
+ 			if (server_id_network_order != server_data.server_nip) {
+ 				/* client talks to somebody else */
+-				log1("server ID doesn't match, ignoring");
++				log1("server ID doesn't match%s", ", ignoring");
+ 				continue;
+ 			}
+ 		}
+@@ -1162,7 +1162,7 @@ o DHCPREQUEST generated during REBINDING state:
+ 			if (!requested_ip_opt) {
+ 				requested_nip = packet.ciaddr;
+ 				if (requested_nip == 0) {
+-					log1("no requested IP and no ciaddr, ignoring");
++					log1("no requested IP and no ciaddr%s", ", ignoring");
+ 					break;
+ 				}
+ 			}
+diff --git a/networking/udhcp/dhcprelay.c b/networking/udhcp/dhcprelay.c
+index 86dcb1af0..ef9447b4b 100644
+--- a/networking/udhcp/dhcprelay.c
++++ b/networking/udhcp/dhcprelay.c
+@@ -186,7 +186,7 @@ static int sendto_ip4(int sock, const void *msg, int msg_len, struct sockaddr_in
+ 	err = sendto(sock, msg, msg_len, 0, (struct sockaddr*) to, sizeof(*to));
+ 	err -= msg_len;
+ 	if (err)
+-		bb_perror_msg("sendto");
++		bb_simple_perror_msg("sendto");
+ 	return err;
+ }
+ 
+@@ -273,7 +273,7 @@ int dhcprelay_main(int argc UNUSED_PARAM, char **argv)
+ 		bb_show_usage();
+ 	if (argv[3]) {
+ 		if (!inet_aton(argv[3], &server_addr.sin_addr))
+-			bb_perror_msg_and_die("bad server IP");
++			bb_simple_perror_msg_and_die("bad server IP");
+ 	}
+ 
+ 	iface_list = make_iface_list(argv + 1, &num_sockets);
+diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c
+index 64af802a3..6d4375237 100644
+--- a/networking/udhcp/packet.c
++++ b/networking/udhcp/packet.c
+@@ -85,14 +85,14 @@ int FAST_FUNC udhcp_recv_kernel_packet(struct dhcp_packet *packet, int fd)
+ 	memset(packet, 0, sizeof(*packet));
+ 	bytes = safe_read(fd, packet, sizeof(*packet));
+ 	if (bytes < 0) {
+-		log1("packet read error, ignoring");
++		log1s("packet read error, ignoring");
+ 		return bytes; /* returns -1 */
+ 	}
+ 
+ 	if (bytes < offsetof(struct dhcp_packet, options)
+ 	 || packet->cookie != htonl(DHCP_MAGIC)
+ 	) {
+-		bb_info_msg("packet with bad magic, ignoring");
++		bb_simple_info_msg("packet with bad magic, ignoring");
+ 		return -2;
+ 	}
+ 	log1("received %s", "a packet");
+diff --git a/networking/udhcp/signalpipe.c b/networking/udhcp/signalpipe.c
+index 81d1fc01a..7df671245 100644
+--- a/networking/udhcp/signalpipe.c
++++ b/networking/udhcp/signalpipe.c
+@@ -28,7 +28,7 @@ static void signal_handler(int sig)
+ 	int sv = errno;
+ 	unsigned char ch = sig; /* use char, avoid dealing with partial writes */
+ 	if (write(WRITE_FD, &ch, 1) != 1)
+-		bb_perror_msg("can't send signal");
++		bb_simple_perror_msg("can't send signal");
+ 	errno = sv;
+ }
+ 
+diff --git a/networking/udhcp/socket.c b/networking/udhcp/socket.c
+index 34049c3ee..65a1a8ead 100644
+--- a/networking/udhcp/socket.c
++++ b/networking/udhcp/socket.c
+@@ -87,7 +87,7 @@ int FAST_FUNC udhcp_listen_socket(/*uint32_t ip,*/ int port, const char *inf)
+ 
+ 	setsockopt_reuseaddr(fd);
+ 	if (setsockopt_broadcast(fd) == -1)
+-		bb_perror_msg_and_die("SO_BROADCAST");
++		bb_simple_perror_msg_and_die("SO_BROADCAST");
+ 
+ 	/* SO_BINDTODEVICE doesn't work on ethernet aliases (ethN:M) */
+ 	colon = strrchr(inf, ':');
+diff --git a/networking/wget.c b/networking/wget.c
+index b6f9d605a..9e5a40b6f 100644
+--- a/networking/wget.c
++++ b/networking/wget.c
+@@ -368,7 +368,7 @@ static void alarm_handler(int sig UNUSED_PARAM)
+ {
+ 	/* This is theoretically unsafe (uses stdio and malloc in signal handler) */
+ 	if (G.die_if_timed_out)
+-		bb_error_msg_and_die("download timed out");
++		bb_simple_error_msg_and_die("download timed out");
+ }
+ static void set_alarm(void)
+ {
+@@ -452,7 +452,7 @@ static char fgets_trim_sanitize(FILE *fp, const char *fmt)
+ 
+ 	set_alarm();
+ 	if (fgets(G.wget_buf, sizeof(G.wget_buf), fp) == NULL)
+-		bb_perror_msg_and_die("error getting response");
++		bb_simple_perror_msg_and_die("error getting response");
+ 	clear_alarm();
+ 
+ 	buf_ptr = strchrnul(G.wget_buf, '\n');
+@@ -633,7 +633,7 @@ static char *get_sanitized_hdr(FILE *fp)
+ 
+ static void reset_beg_range_to_zero(void)
+ {
+-	bb_error_msg("restart failed");
++	bb_simple_error_msg("restart failed");
+ 	G.beg_range = 0;
+ 	xlseek(G.output_fd, 0, SEEK_SET);
+ 	/* Done at the end instead: */
+@@ -651,7 +651,7 @@ static int spawn_https_helper_openssl(const char *host, unsigned port)
+ 
+ 	if (socketpair(AF_UNIX, SOCK_STREAM, 0, sp) != 0)
+ 		/* Kernel can have AF_UNIX support disabled */
+-		bb_perror_msg_and_die("socketpair");
++		bb_simple_perror_msg_and_die("socketpair");
+ 
+ 	if (!strchr(host, ':'))
+ 		host = allocated = xasprintf("%s:%u", host, port);
+@@ -724,7 +724,7 @@ static void spawn_ssl_client(const char *host, int network_fd, int flags)
+ 
+ 	if (!(option_mask32 & WGET_OPT_NO_CHECK_CERT)) {
+ 		option_mask32 |= WGET_OPT_NO_CHECK_CERT;
+-		bb_error_msg("note: TLS certificate validation not implemented");
++		bb_simple_error_msg("note: TLS certificate validation not implemented");
+ 	}
+ 
+ 	servername = xstrdup(host);
+@@ -733,7 +733,7 @@ static void spawn_ssl_client(const char *host, int network_fd, int flags)
+ 
+ 	if (socketpair(AF_UNIX, SOCK_STREAM, 0, sp) != 0)
+ 		/* Kernel can have AF_UNIX support disabled */
+-		bb_perror_msg_and_die("socketpair");
++		bb_simple_perror_msg_and_die("socketpair");
+ 
+ 	fflush_all();
+ 	pid = BB_MMU ? xfork() : xvfork();
+@@ -785,7 +785,7 @@ static FILE* prepare_ftp_session(FILE **dfpp, struct host_info *target, len_and_
+ #endif
+ 
+ 	if (ftpcmd(NULL, NULL, sfp) != 220)
+-		bb_error_msg_and_die("%s", G.wget_buf);
++		bb_simple_error_msg_and_die(G.wget_buf);
+ 		/* note: ftpcmd() sanitizes G.wget_buf, ok to print */
+ 
+ 	/* Split username:password pair */
+@@ -948,7 +948,7 @@ static void NOINLINE retrieve_file_data(FILE *dfp)
+ 			if (errno != EAGAIN) {
+ 				if (ferror(dfp)) {
+ 					progress_meter(PROGRESS_END);
+-					bb_perror_msg_and_die(bb_msg_read_error);
++					bb_simple_perror_msg_and_die(bb_msg_read_error);
+ 				}
+ 				break; /* EOF, not error */
+ 			}
+@@ -961,7 +961,7 @@ static void NOINLINE retrieve_file_data(FILE *dfp)
+ # if ENABLE_FEATURE_WGET_TIMEOUT
+ 				if (second_cnt != 0 && --second_cnt == 0) {
+ 					progress_meter(PROGRESS_END);
+-					bb_error_msg_and_die("download timed out");
++					bb_simple_error_msg_and_die("download timed out");
+ 				}
+ # endif
+ 				/* We used to loop back to poll here,
+@@ -1014,7 +1014,7 @@ static void NOINLINE retrieve_file_data(FILE *dfp)
+ 	G.got_clen = 1; /* makes it show 100% even for download of (formerly) unknown size */
+ 	progress_meter(PROGRESS_END);
+ 	if (G.content_len != 0) {
+-		bb_perror_msg_and_die("connection closed prematurely");
++		bb_simple_perror_msg_and_die("connection closed prematurely");
+ 		/* GNU wget says "DATE TIME (NN MB/s) - Connection closed at byte NNN. Retrying." */
+ 	}
+ 
+@@ -1348,7 +1348,7 @@ However, in real world it was observed that some web servers
+ 			}
+ 			if (key == KEY_location && status >= 300) {
+ 				if (--redir_limit == 0)
+-					bb_error_msg_and_die("too many redirections");
++					bb_simple_error_msg_and_die("too many redirections");
+ 				fclose(sfp);
+ 				if (str[0] == '/') {
+ 					free(redirected_path);
+diff --git a/networking/zcip.c b/networking/zcip.c
+index f95b6f7fb..134dfb2df 100644
+--- a/networking/zcip.c
++++ b/networking/zcip.c
+@@ -276,7 +276,7 @@ int zcip_main(int argc UNUSED_PARAM, char **argv)
+ 		if (inet_aton(l_opt, &net) == 0
+ 		 || (net.s_addr & htonl(IN_CLASSB_NET)) != net.s_addr
+ 		) {
+-			bb_error_msg_and_die("invalid network address");
++			bb_simple_error_msg_and_die("invalid network address");
+ 		}
+ 		G.localnet_ip = ntohl(net.s_addr);
+ 	}
+@@ -285,7 +285,7 @@ int zcip_main(int argc UNUSED_PARAM, char **argv)
+ 		if (inet_aton(r_opt, &ip) == 0
+ 		 || (ntohl(ip.s_addr) & IN_CLASSB_NET) != G.localnet_ip
+ 		) {
+-			bb_error_msg_and_die("invalid link address");
++			bb_simple_error_msg_and_die("invalid link address");
+ 		}
+ 		chosen_nip = ip.s_addr;
+ 	}
+@@ -473,7 +473,7 @@ int zcip_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 		// Read ARP packet
+ 		if (safe_read(sock_fd, &p, sizeof(p)) < 0) {
+-			bb_perror_msg_and_die(bb_msg_read_error);
++			bb_simple_perror_msg_and_die(bb_msg_read_error);
+ 		}
+ 
+ 		if (p.eth.ether_type != htons(ETHERTYPE_ARP))
+diff --git a/printutils/lpr.c b/printutils/lpr.c
+index 7acb6c357..77d1a79a4 100644
+--- a/printutils/lpr.c
++++ b/printutils/lpr.c
+@@ -167,7 +167,7 @@ int lpqr_main(int argc UNUSED_PARAM, char *argv[])
+ 	// LPR ------------------------
+ 	//
+ 	if (opts & LPR_V)
+-		bb_error_msg("connected to server");
++		bb_simple_error_msg("connected to server");
+ 
+ 	job = getpid() % 1000;
+ 	hostname = safe_gethostname();
+@@ -206,7 +206,7 @@ int lpqr_main(int argc UNUSED_PARAM, char *argv[])
+ 		 * Standard lpr works around it by refusing to send such jobs:
+ 		 */
+ 		if (st.st_size == 0) {
+-			bb_error_msg("nothing to print");
++			bb_simple_error_msg("nothing to print");
+ 			continue;
+ 		}
+ 
+@@ -246,7 +246,7 @@ int lpqr_main(int argc UNUSED_PARAM, char *argv[])
+ 
+ 		// send control file
+ 		if (opts & LPR_V)
+-			bb_error_msg("sending control file");
++			bb_simple_error_msg("sending control file");
+ 		/* "Acknowledgement processing must occur as usual
+ 		 * after the command is sent." */
+ 		cflen = (unsigned)strlen(controlfile);
+@@ -262,12 +262,12 @@ int lpqr_main(int argc UNUSED_PARAM, char *argv[])
+ 
+ 		// send data file, with name "dfaXXX"
+ 		if (opts & LPR_V)
+-			bb_error_msg("sending data file");
++			bb_simple_error_msg("sending data file");
+ 		fdprintf(fd, "\x3" "%"OFF_FMT"u d%s\n", st.st_size, remote_filename);
+ 		get_response_or_say_and_die(fd, "sending data file");
+ 		if (bb_copyfd_size(dfd, fd, st.st_size) != st.st_size) {
+ 			// We're screwed. We sent less bytes than we advertised.
+-			bb_error_msg_and_die("local file changed size?!");
++			bb_simple_error_msg_and_die("local file changed size?!");
+ 		}
+ 		write(fd, "", 1); // send ACK
+ 		get_response_or_say_and_die(fd, "sending data file");
+@@ -283,7 +283,7 @@ int lpqr_main(int argc UNUSED_PARAM, char *argv[])
+ 
+ 		// say job accepted
+ 		if (opts & LPR_V)
+-			bb_error_msg("job accepted");
++			bb_simple_error_msg("job accepted");
+ 
+ 		// next, please!
+ 		job = (job + 1) % 1000;
+diff --git a/procps/kill.c b/procps/kill.c
+index a30a79dd8..4a2eab613 100644
+--- a/procps/kill.c
++++ b/procps/kill.c
+@@ -268,7 +268,7 @@ int kill_main(int argc UNUSED_PARAM, char **argv)
+ #if ENABLE_KILL || ENABLE_KILLALL
+ 	/* Pid or name is required for kill/killall */
+ 	if (!arg) {
+-		bb_error_msg("you need to specify whom to kill");
++		bb_simple_error_msg("you need to specify whom to kill");
+ 		return EXIT_FAILURE;
+ 	}
+ 
+diff --git a/procps/mpstat.c b/procps/mpstat.c
+index 4ea1b5d97..52a436a55 100644
+--- a/procps/mpstat.c
++++ b/procps/mpstat.c
+@@ -931,7 +931,7 @@ int mpstat_main(int argc UNUSED_PARAM, char **argv)
+ 				/* Get CPU number */
+ 				unsigned n = xatoi_positive(t);
+ 				if (n >= G.cpu_nr)
+-					bb_error_msg_and_die("not that many processors");
++					bb_simple_error_msg_and_die("not that many processors");
+ 				n++;
+ 				G.cpu_bitmap[n >> 3] |= 1 << (n & 7);
+ 			}
+diff --git a/procps/powertop.c b/procps/powertop.c
+index e70f5433b..d508b5f78 100644
+--- a/procps/powertop.c
++++ b/procps/powertop.c
+@@ -657,7 +657,7 @@ static void show_timerstats(void)
+ 		}
+ 	} else {
+ 		bb_putchar('\n');
+-		bb_error_msg("no stats available; run as root or"
++		bb_simple_error_msg("no stats available; run as root or"
+ 				" enable the timer_stats module");
+ 	}
+ }
+@@ -707,7 +707,7 @@ int powertop_main(int argc UNUSED_PARAM, char UNUSED_PARAM **argv)
+ 
+ 	/* Print warning when we don't have superuser privileges */
+ 	if (geteuid() != 0)
+-		bb_error_msg("run as root to collect enough information");
++		bb_simple_error_msg("run as root to collect enough information");
+ 
+ 	/* Get number of CPUs */
+ 	G.total_cpus = get_cpu_count();
+diff --git a/procps/pstree.c b/procps/pstree.c
+index 1d124d2d2..67b711168 100644
+--- a/procps/pstree.c
++++ b/procps/pstree.c
+@@ -404,7 +404,7 @@ int pstree_main(int argc UNUSED_PARAM, char **argv)
+ 	else {
+ 		dump_by_user(find_proc(1), uid);
+ 		if (!G.dumped) {
+-			bb_error_msg_and_die("no processes found");
++			bb_simple_error_msg_and_die("no processes found");
+ 		}
+ 	}
+ 
+diff --git a/procps/top.c b/procps/top.c
+index 89f9d23f4..8fe53324f 100644
+--- a/procps/top.c
++++ b/procps/top.c
+@@ -1229,7 +1229,7 @@ int top_main(int argc UNUSED_PARAM, char **argv)
+ #endif
+ 		} /* end of "while we read /proc" */
+ 		if (ntop == 0) {
+-			bb_error_msg("no process info in /proc");
++			bb_simple_error_msg("no process info in /proc");
+ 			break;
+ 		}
+ 
+diff --git a/runit/chpst.c b/runit/chpst.c
+index 5e77245f6..af777568f 100644
+--- a/runit/chpst.c
++++ b/runit/chpst.c
+@@ -270,7 +270,7 @@ static void limit(int what, long l)
+ 	else
+ 		r.rlim_cur = l;
+ 	if (setrlimit(what, &r) == -1)
+-		bb_perror_msg_and_die("setrlimit");
++		bb_simple_perror_msg_and_die("setrlimit");
+ }
+ 
+ int chpst_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+@@ -467,12 +467,12 @@ int chpst_main(int argc UNUSED_PARAM, char **argv)
+ 	if (opt & OPT_n) {
+ 		errno = 0;
+ 		if (nice(xatoi(nicestr)) == -1)
+-			bb_perror_msg_and_die("nice");
++			bb_simple_perror_msg_and_die("nice");
+ 	}
+ 
+ 	if (opt & OPT_u) {
+ 		if (setgroups(1, &ugid.gid) == -1)
+-			bb_perror_msg_and_die("setgroups");
++			bb_simple_perror_msg_and_die("setgroups");
+ 		xsetgid(ugid.gid);
+ 		xsetuid(ugid.uid);
+ 	}
+diff --git a/runit/svlogd.c b/runit/svlogd.c
+index c9e5346d1..a250058a1 100644
+--- a/runit/svlogd.c
++++ b/runit/svlogd.c
+@@ -274,7 +274,7 @@ static void warnx(const char *m0, const char *m1)
+ }
+ static void pause_nomem(void)
+ {
+-	bb_error_msg(PAUSE"out of memory");
++	bb_simple_error_msg(PAUSE"out of memory");
+ 	sleep(3);
+ }
+ static void pause1cannot(const char *m0)
+diff --git a/selinux/chcon.c b/selinux/chcon.c
+index 5bf91710c..afe7f713d 100644
+--- a/selinux/chcon.c
++++ b/selinux/chcon.c
+@@ -107,7 +107,7 @@ static int FAST_FUNC change_filedir_context(
+ 
+ 	context_string = context_str(context);
+ 	if (!context_string) {
+-		bb_error_msg("can't obtain security context in text expression");
++		bb_simple_error_msg("can't obtain security context in text expression");
+ 		goto skip;
+ 	}
+ 
+@@ -194,7 +194,7 @@ int chcon_main(int argc UNUSED_PARAM, char **argv)
+ 		/* specified_context is never NULL -
+ 		 * "-1" in opt_complementary prevents this. */
+ 		if (!argv[0])
+-			bb_error_msg_and_die("too few arguments");
++			bb_simple_error_msg_and_die("too few arguments");
+ 	}
+ 
+ 	for (i = 0; (fname = argv[i]) != NULL; i++) {
+diff --git a/selinux/getenforce.c b/selinux/getenforce.c
+index 0286dd0be..f082ba614 100644
+--- a/selinux/getenforce.c
++++ b/selinux/getenforce.c
+@@ -29,12 +29,12 @@ int getenforce_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
+ 
+ 	rc = is_selinux_enabled();
+ 	if (rc < 0)
+-		bb_error_msg_and_die("is_selinux_enabled() failed");
++		bb_simple_error_msg_and_die("is_selinux_enabled() failed");
+ 
+ 	if (rc == 1) {
+ 		rc = security_getenforce();
+ 		if (rc < 0)
+-			bb_error_msg_and_die("getenforce() failed");
++			bb_simple_error_msg_and_die("getenforce() failed");
+ 
+ 		if (rc)
+ 			puts("Enforcing");
+diff --git a/selinux/getsebool.c b/selinux/getsebool.c
+index 6d7805c8d..36ddd45b9 100644
+--- a/selinux/getsebool.c
++++ b/selinux/getsebool.c
+@@ -40,7 +40,7 @@ int getsebool_main(int argc, char **argv)
+ 
+ 		rc = security_get_boolean_names(&names, &len);
+ 		if (rc)
+-			bb_perror_msg_and_die("can't get boolean names");
++			bb_simple_perror_msg_and_die("can't get boolean names");
+ 
+ 		if (!len) {
+ 			puts("No booleans");
+diff --git a/selinux/load_policy.c b/selinux/load_policy.c
+index b7930839c..eac6ba6c1 100644
+--- a/selinux/load_policy.c
++++ b/selinux/load_policy.c
+@@ -31,7 +31,7 @@ int load_policy_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
+ 
+ 	rc = selinux_mkload_policy(1);
+ 	if (rc < 0) {
+-		bb_perror_msg_and_die("can't load policy");
++		bb_simple_perror_msg_and_die("can't load policy");
+ 	}
+ 
+ 	return 0;
+diff --git a/selinux/runcon.c b/selinux/runcon.c
+index a5a394427..bc4fa23e0 100644
+--- a/selinux/runcon.c
++++ b/selinux/runcon.c
+@@ -65,7 +65,7 @@ static context_t runcon_compute_new_context(char *user, char *role, char *type,
+ 	security_context_t cur_context;
+ 
+ 	if (getcon(&cur_context))
+-		bb_error_msg_and_die("can't get current context");
++		bb_simple_error_msg_and_die("can't get current context");
+ 
+ 	if (compute_trans) {
+ 		security_context_t file_context, new_context;
+@@ -75,7 +75,7 @@ static context_t runcon_compute_new_context(char *user, char *role, char *type,
+ 					command);
+ 		if (security_compute_create(cur_context, file_context,
+ 					SECCLASS_PROCESS, &new_context))
+-			bb_error_msg_and_die("unable to compute a new context");
++			bb_simple_error_msg_and_die("unable to compute a new context");
+ 		cur_context = new_context;
+ 	}
+ 
+@@ -137,7 +137,7 @@ int runcon_main(int argc UNUSED_PARAM, char **argv)
+ 	if (!(opts & OPTS_CONTEXT_COMPONENT)) {
+ 		context = *argv++;
+ 		if (!argv[0])
+-			bb_error_msg_and_die("no command given");
++			bb_simple_error_msg_and_die("no command given");
+ 	}
+ 
+ 	if (context) {
+diff --git a/selinux/sestatus.c b/selinux/sestatus.c
+index 6954aca70..098a4d189 100644
+--- a/selinux/sestatus.c
++++ b/selinux/sestatus.c
+@@ -216,5 +216,5 @@ int sestatus_main(int argc UNUSED_PARAM, char **argv)
+ 	return 0;
+ 
+   error:
+-	bb_perror_msg_and_die("libselinux returns unknown state");
++	bb_simple_perror_msg_and_die("libselinux returns unknown state");
+ }
+diff --git a/selinux/setenforce.c b/selinux/setenforce.c
+index c28de6ec5..996034f8e 100644
+--- a/selinux/setenforce.c
++++ b/selinux/setenforce.c
+@@ -49,7 +49,7 @@ int setenforce_main(int argc UNUSED_PARAM, char **argv)
+ 			continue;
+ 		rc = security_setenforce(i & 1);
+ 		if (rc < 0)
+-			bb_perror_msg_and_die("setenforce() failed");
++			bb_simple_perror_msg_and_die("setenforce() failed");
+ 		return 0;
+ 	}
+ 
+diff --git a/selinux/setfiles.c b/selinux/setfiles.c
+index 740eaf8fb..55bfb4d02 100644
+--- a/selinux/setfiles.c
++++ b/selinux/setfiles.c
+@@ -182,7 +182,7 @@ static void inc_err(void)
+ {
+ 	nerr++;
+ 	if (nerr > 9 && !FLAG_d_debug) {
+-		bb_error_msg_and_die("exiting after 10 errors");
++		bb_simple_error_msg_and_die("exiting after 10 errors");
+ 	}
+ }
+ 
+diff --git a/selinux/setsebool.c b/selinux/setsebool.c
+index 579118172..2af23acd7 100644
+--- a/selinux/setsebool.c
++++ b/selinux/setsebool.c
+@@ -46,7 +46,7 @@ int setsebool_main(int argc, char **argv)
+ 	}
+ 
+ 	if (security_set_boolean(argv[1], value) < 0)
+-		bb_error_msg_and_die("can't set boolean");
++		bb_simple_error_msg_and_die("can't set boolean");
+ 
+ 	return 0;
+ }
+diff --git a/shell/hush.c b/shell/hush.c
+index f82747f74..19b97e2a5 100644
+--- a/shell/hush.c
++++ b/shell/hush.c
+@@ -1398,7 +1398,7 @@ static void syntax_error(unsigned lineno UNUSED_PARAM, const char *msg)
+ 	if (msg)
+ 		bb_error_msg("syntax error: %s", msg);
+ 	else
+-		bb_error_msg("syntax error");
++		bb_simple_error_msg("syntax error");
+ 	die_if_script();
+ }
+ 
+@@ -1637,7 +1637,7 @@ static int refill_HFILE_and_getc(HFILE *fp)
+ 	fp->cur = fp->buf;
+ 	n = safe_read(fp->fd, fp->buf, sizeof(fp->buf));
+ 	if (n < 0) {
+-		bb_perror_msg("read error");
++		bb_simple_perror_msg("read error");
+ 		n = 0;
+ 	}
+ 	fp->end = fp->buf + n;
+@@ -2282,7 +2282,7 @@ static int set_local_var(char *str, unsigned flags)
+ 
+ 	eq_sign = strchr(str, '=');
+ 	if (HUSH_DEBUG && !eq_sign)
+-		bb_error_msg_and_die("BUG in setvar");
++		bb_simple_error_msg_and_die("BUG in setvar");
+ 
+ 	name_len = eq_sign - str + 1; /* including '=' */
+ 	cur_pp = &G.top_var;
+@@ -2505,7 +2505,7 @@ static void set_vars_and_save_old(char **strings)
+ 
+ 		eq = strchr(*s, '=');
+ 		if (HUSH_DEBUG && !eq)
+-			bb_error_msg_and_die("BUG in varexp4");
++			bb_simple_error_msg_and_die("BUG in varexp4");
+ 		var_pp = get_ptr_to_local_var(*s, eq - *s);
+ 		if (var_pp) {
+ 			var_p = *var_pp;
+@@ -4246,7 +4246,7 @@ static int parse_redir_right_fd(o_string *as_string, struct in_str *input)
+ 
+ //TODO: this is the place to catch ">&file" bashism (redirect both fd 1 and 2)
+ 
+-	bb_error_msg("ambiguous redirect");
++	bb_simple_error_msg("ambiguous redirect");
+ 	return REDIRFD_SYNTAX_ERR;
+ }
+ 
+@@ -6956,7 +6956,7 @@ static char *expand_string_to_string(const char *str, int EXP_flags, int do_unba
+ 	} else {
+ 		if (HUSH_DEBUG)
+ 			if (list[1])
+-				bb_error_msg_and_die("BUG in varexp2");
++				bb_simple_error_msg_and_die("BUG in varexp2");
+ 		/* actually, just move string 2*sizeof(char*) bytes back */
+ 		overlapping_strcpy((char*)list, list[0]);
+ 		if (do_unbackslash)
+@@ -7217,7 +7217,7 @@ static void re_execute_shell(char ***to_free, const char *s,
+ 	if (argv[0][0] == '/')
+ 		execve(argv[0], argv, pp);
+ 	xfunc_error_retval = 127;
+-	bb_error_msg_and_die("can't re-execute the shell");
++	bb_simple_error_msg_and_die("can't re-execute the shell");
+ }
+ #endif  /* !BB_MMU */
+ 
+@@ -7919,7 +7919,7 @@ static void leave_var_nest_level(void)
+ 	G.var_nest_level--;
+ 	debug_printf_env("var_nest_level-- %u\n", G.var_nest_level);
+ 	if (HUSH_DEBUG && (int)G.var_nest_level < 0)
+-		bb_error_msg_and_die("BUG: nesting underflow");
++		bb_simple_error_msg_and_die("BUG: nesting underflow");
+ 
+ 	remove_nested_vars();
+ }
+@@ -8776,7 +8776,7 @@ static int checkjobs(struct pipe *fg_pipe, pid_t waitfor_pid)
+ 		childpid = waitpid(-1, &status, attributes);
+ 		if (childpid <= 0) {
+ 			if (childpid && errno != ECHILD)
+-				bb_perror_msg("waitpid");
++				bb_simple_perror_msg("waitpid");
+ #if ENABLE_HUSH_FAST
+ 			else { /* Until next SIGCHLD, waitpid's are useless */
+ 				G.we_have_children = (childpid == 0);
+@@ -9308,7 +9308,7 @@ static NOINLINE int run_pipe(struct pipe *pi)
+ 		argv_expanded = NULL;
+ 		if (command->pid < 0) { /* [v]fork failed */
+ 			/* Clearly indicate, was it fork or vfork */
+-			bb_perror_msg(BB_MMU ? "vfork"+1 : "vfork");
++			bb_simple_perror_msg(BB_MMU ? "vfork"+1 : "vfork");
+ 		} else {
+ 			pi->alive_cmds++;
+ #if ENABLE_HUSH_JOB
+@@ -10617,7 +10617,7 @@ static int FAST_FUNC builtin_read(char **argv)
+ 	}
+ 
+ 	if ((uintptr_t)r > 1) {
+-		bb_error_msg("%s", r);
++		bb_simple_error_msg(r);
+ 		r = (char*)(uintptr_t)1;
+ 	}
+ 
+@@ -10862,7 +10862,7 @@ static int FAST_FUNC builtin_unset(char **argv)
+ 	if (opts == (unsigned)-1)
+ 		return EXIT_FAILURE;
+ 	if (opts == 3) {
+-		bb_error_msg("unset: -v and -f are exclusive");
++		bb_simple_error_msg("unset: -v and -f are exclusive");
+ 		return EXIT_FAILURE;
+ 	}
+ 	argv += optind;
+@@ -11025,7 +11025,7 @@ Test that VAR is a valid variable name?
+ 
+ 	optstring = *++argv;
+ 	if (!optstring || !(var = *++argv)) {
+-		bb_error_msg("usage: getopts OPTSTRING VAR [ARGS]");
++		bb_simple_error_msg("usage: getopts OPTSTRING VAR [ARGS]");
+ 		return EXIT_FAILURE;
+ 	}
+ 
+@@ -11254,7 +11254,7 @@ static int FAST_FUNC builtin_trap(char **argv)
+ 	}
+ 
+ 	if (!argv[1]) { /* no second arg */
+-		bb_error_msg("trap: invalid arguments");
++		bb_simple_error_msg("trap: invalid arguments");
+ 		return EXIT_FAILURE;
+ 	}
+ 
+@@ -11295,7 +11295,7 @@ static struct pipe *parse_jobspec(const char *str)
+ 		/* It is "%%", "%+" or "%" - current job */
+ 		jobnum = G.last_jobid;
+ 		if (jobnum == 0) {
+-			bb_error_msg("no current job");
++			bb_simple_error_msg("no current job");
+ 			return NULL;
+ 		}
+ 	}
+@@ -11372,7 +11372,7 @@ static int FAST_FUNC builtin_fg_bg(char **argv)
+ 			delete_finished_job(pi);
+ 			return EXIT_SUCCESS;
+ 		}
+-		bb_perror_msg("kill (SIGCONT)");
++		bb_simple_perror_msg("kill (SIGCONT)");
+ 	}
+ 
+ 	if (argv[0][0] == 'f') {
+diff --git a/shell/shell_common.c b/shell/shell_common.c
+index e0582adfb..a93533903 100644
+--- a/shell/shell_common.c
++++ b/shell/shell_common.c
+@@ -619,7 +619,7 @@ shell_builtin_ulimit(char **argv)
+ 				limit.rlim_cur = val;
+ //bb_error_msg("setrlimit(%d, %lld, %lld)", limits_tbl[i].cmd, (long long)limit.rlim_cur, (long long)limit.rlim_max);
+ 			if (setrlimit(limits_tbl[i].cmd, &limit) < 0) {
+-				bb_perror_msg("error setting limit");
++				bb_simple_perror_msg("error setting limit");
+ 				return EXIT_FAILURE;
+ 			}
+ 		}
+diff --git a/sysklogd/klogd.c b/sysklogd/klogd.c
+index 17b6ca235..bdd0b6325 100644
+--- a/sysklogd/klogd.c
++++ b/sysklogd/klogd.c
+@@ -244,7 +244,7 @@ int klogd_main(int argc UNUSED_PARAM, char **argv)
+ 		if (n < 0) {
+ 			if (errno == EINTR)
+ 				continue;
+-			bb_perror_msg(READ_ERROR);
++			bb_simple_perror_msg(READ_ERROR);
+ 			break;
+ 		}
+ 		start[n] = '\0';
+diff --git a/sysklogd/logread.c b/sysklogd/logread.c
+index ea41fc0c8..1e1f1347f 100644
+--- a/sysklogd/logread.c
++++ b/sysklogd/logread.c
+@@ -88,7 +88,7 @@ static void error_exit(const char *str)
+ }
+ #else
+ /* On Linux, shmdt is not mandatory on exit */
+-# define error_exit(str) bb_perror_msg_and_die(str)
++# define error_exit(str) bb_simple_perror_msg_and_die(str)
+ #endif
+ 
+ /*
+diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
+index d0dd1bd20..0e226124a 100644
+--- a/sysklogd/syslogd.c
++++ b/sysklogd/syslogd.c
+@@ -572,12 +572,12 @@ static void ipcsyslog_init(void)
+ 
+ 	G.shmid = shmget(KEY_ID, G.shm_size, IPC_CREAT | 0644);
+ 	if (G.shmid == -1) {
+-		bb_perror_msg_and_die("shmget");
++		bb_simple_perror_msg_and_die("shmget");
+ 	}
+ 
+ 	G.shbuf = shmat(G.shmid, NULL, 0);
+ 	if (G.shbuf == (void*) -1L) { /* shmat has bizarre error return */
+-		bb_perror_msg_and_die("shmat");
++		bb_simple_perror_msg_and_die("shmat");
+ 	}
+ 
+ 	memset(G.shbuf, 0, G.shm_size);
+@@ -592,7 +592,7 @@ static void ipcsyslog_init(void)
+ 			if (G.s_semid != -1)
+ 				return;
+ 		}
+-		bb_perror_msg_and_die("semget");
++		bb_simple_perror_msg_and_die("semget");
+ 	}
+ }
+ 
+@@ -603,7 +603,7 @@ static void log_to_shmem(const char *msg)
+ 	int len;
+ 
+ 	if (semop(G.s_semid, G.SMwdn, 3) == -1) {
+-		bb_perror_msg_and_die("SMwdn");
++		bb_simple_perror_msg_and_die("SMwdn");
+ 	}
+ 
+ 	/* Circular Buffer Algorithm:
+@@ -631,7 +631,7 @@ static void log_to_shmem(const char *msg)
+ 		goto again;
+ 	}
+ 	if (semop(G.s_semid, G.SMwup, 1) == -1) {
+-		bb_perror_msg_and_die("SMwup");
++		bb_simple_perror_msg_and_die("SMwup");
+ 	}
+ 	if (DEBUG)
+ 		printf("tail:%d\n", G.shbuf->tail);
+diff --git a/util-linux/acpid.c b/util-linux/acpid.c
+index 7274b6866..95f8150e2 100644
+--- a/util-linux/acpid.c
++++ b/util-linux/acpid.c
+@@ -148,7 +148,7 @@ static void process_event(const char *event)
+ 	const char *args[] = { "run-parts", handler, NULL };
+ 
+ 	// log the event
+-	bb_error_msg("%s", event);
++	bb_simple_error_msg(event);
+ 
+ 	// spawn handler
+ 	// N.B. run-parts would require scripts to have #!/bin/sh
+diff --git a/util-linux/dmesg.c b/util-linux/dmesg.c
+index b797c7b2a..a1f269142 100644
+--- a/util-linux/dmesg.c
++++ b/util-linux/dmesg.c
+@@ -74,7 +74,7 @@ int dmesg_main(int argc UNUSED_PARAM, char **argv)
+ 	opts = getopt32(argv, "cs:+n:+r", &len, &level);
+ 	if (opts & OPT_n) {
+ 		if (klogctl(8, NULL, (long) level))
+-			bb_perror_msg_and_die("klogctl");
++			bb_simple_perror_msg_and_die("klogctl");
+ 		return EXIT_SUCCESS;
+ 	}
+ 
+@@ -88,7 +88,7 @@ int dmesg_main(int argc UNUSED_PARAM, char **argv)
+ 	buf = xmalloc(len);
+ 	len = klogctl(3 + (opts & OPT_c), buf, len); /* read ring buffer */
+ 	if (len < 0)
+-		bb_perror_msg_and_die("klogctl");
++		bb_simple_perror_msg_and_die("klogctl");
+ 	if (len == 0)
+ 		return EXIT_SUCCESS;
+ 
+diff --git a/util-linux/eject.c b/util-linux/eject.c
+index 749e2c986..3ccb4ae89 100644
+--- a/util-linux/eject.c
++++ b/util-linux/eject.c
+@@ -70,7 +70,7 @@ static void eject_scsi(const char *dev)
+ 	sg_io_hdr_t io_hdr;
+ 
+ 	if ((ioctl(dev_fd, SG_GET_VERSION_NUM, &i) < 0) || (i < 30000))
+-		bb_error_msg_and_die("not a sg device or old sg driver");
++		bb_simple_error_msg_and_die("not a sg device or old sg driver");
+ 
+ 	memset(&io_hdr, 0, sizeof(sg_io_hdr_t));
+ 	io_hdr.interface_id = 'S';
+diff --git a/util-linux/fdformat.c b/util-linux/fdformat.c
+index ff3bc4870..e1c8561d6 100644
+--- a/util-linux/fdformat.c
++++ b/util-linux/fdformat.c
+@@ -117,7 +117,7 @@ int fdformat_main(int argc UNUSED_PARAM, char **argv)
+ 			read_bytes = safe_read(fd, data, n);
+ 			if (read_bytes != n) {
+ 				if (read_bytes < 0) {
+-					bb_perror_msg(bb_msg_read_error);
++					bb_simple_perror_msg(bb_msg_read_error);
+ 				}
+ 				bb_error_msg_and_die("problem reading cylinder %d, "
+ 					"expected %d, read %d", cyl, n, read_bytes);
+diff --git a/util-linux/fdisk.c b/util-linux/fdisk.c
+index 58e93bb92..f28d4fdd2 100644
+--- a/util-linux/fdisk.c
++++ b/util-linux/fdisk.c
+@@ -511,7 +511,7 @@ static sector_t bb_BLKGETSIZE_sectors(int fd)
+ 			 * we support can't record more than 32 bit
+ 			 * sector counts or offsets
+ 			 */
+-			bb_error_msg("device has more than 2^32 sectors, can't use all of them");
++			bb_simple_error_msg("device has more than 2^32 sectors, can't use all of them");
+ 			v64 = (uint32_t)-1L;
+ 		}
+ 		return v64;
+diff --git a/util-linux/flock.c b/util-linux/flock.c
+index 130627e93..12c16013c 100644
+--- a/util-linux/flock.c
++++ b/util-linux/flock.c
+@@ -73,7 +73,7 @@ int flock_main(int argc UNUSED_PARAM, char **argv)
+ 	) {
+ 		argv++;
+ 		if (argv[1])
+-			bb_error_msg_and_die("-c takes only one argument");
++			bb_simple_error_msg_and_die("-c takes only one argument");
+ 		opt |= OPT_c;
+ 	}
+ 
+diff --git a/util-linux/fsck_minix.c b/util-linux/fsck_minix.c
+index f523da945..40b86d01b 100644
+--- a/util-linux/fsck_minix.c
++++ b/util-linux/fsck_minix.c
+@@ -321,7 +321,7 @@ static void die(const char *str)
+ {
+ 	if (termios_set)
+ 		tcsetattr_stdin_TCSANOW(&sv_termios);
+-	bb_error_msg_and_die("%s", str);
++	bb_simple_error_msg_and_die(str);
+ }
+ 
+ static void push_filename(const char *name)
+diff --git a/util-linux/getopt.c b/util-linux/getopt.c
+index 1666d3d30..db7db6ff8 100644
+--- a/util-linux/getopt.c
++++ b/util-linux/getopt.c
+@@ -308,7 +308,7 @@ static struct option *add_long_options(struct option *long_options, char *option
+ 				}
+ 				tokptr[tlen] = '\0';
+ 				if (tlen == 0)
+-					bb_error_msg_and_die("empty long option specified");
++					bb_simple_error_msg_and_die("empty long option specified");
+ 			}
+ 			long_options = xrealloc_vector(long_options, 4, long_nr);
+ 			long_options[long_nr].has_arg = arg_opt;
+@@ -380,7 +380,7 @@ int getopt_main(int argc, char **argv)
+ 			puts(" --");
+ 			return 0;
+ 		}
+-		bb_error_msg_and_die("missing optstring argument");
++		bb_simple_error_msg_and_die("missing optstring argument");
+ 	}
+ 
+ 	if (argv[1][0] != '-' || compatible) {
+@@ -416,7 +416,7 @@ int getopt_main(int argc, char **argv)
+ 	if (!optstr) {
+ 		optstr = argv[++n];
+ 		if (!optstr)
+-			bb_error_msg_and_die("missing optstring argument");
++			bb_simple_error_msg_and_die("missing optstring argument");
+ 	}
+ 
+ 	argv[n] = name ? name : argv[0];
+diff --git a/util-linux/hwclock.c b/util-linux/hwclock.c
+index 29f51021e..dc97d8fb4 100644
+--- a/util-linux/hwclock.c
++++ b/util-linux/hwclock.c
+@@ -132,7 +132,7 @@ static void to_sys_clock(const char **pp_rtcname, int utc)
+ 	tv.tv_sec = read_rtc(pp_rtcname, NULL, utc);
+ 	tv.tv_usec = 0;
+ 	if (settimeofday(&tv, &tz))
+-		bb_perror_msg_and_die("settimeofday");
++		bb_simple_perror_msg_and_die("settimeofday");
+ }
+ 
+ static void from_sys_clock(const char **pp_rtcname, int utc)
+@@ -284,7 +284,7 @@ static void set_system_clock_timezone(int utc)
+ 	if (!utc)
+ 		tv.tv_sec += tz.tz_minuteswest * 60;
+ 	if (settimeofday(&tv, &tz))
+-		bb_perror_msg_and_die("settimeofday");
++		bb_simple_perror_msg_and_die("settimeofday");
+ }
+ 
+ //usage:#define hwclock_trivial_usage
+diff --git a/util-linux/ipcs.c b/util-linux/ipcs.c
+index 4863a5c29..df86cfb9d 100644
+--- a/util-linux/ipcs.c
++++ b/util-linux/ipcs.c
+@@ -467,7 +467,7 @@ static void print_shm(int shmid)
+ 	struct ipc_perm *ipcp = &shmds.shm_perm;
+ 
+ 	if (shmctl(shmid, IPC_STAT, &shmds) == -1) {
+-		bb_perror_msg("shmctl");
++		bb_simple_perror_msg("shmctl");
+ 		return;
+ 	}
+ 
+@@ -493,7 +493,7 @@ static void print_msg(int msqid)
+ 	struct ipc_perm *ipcp = &buf.msg_perm;
+ 
+ 	if (msgctl(msqid, IPC_STAT, &buf) == -1) {
+-		bb_perror_msg("msgctl");
++		bb_simple_perror_msg("msgctl");
+ 		return;
+ 	}
+ 
+@@ -527,7 +527,7 @@ static void print_sem(int semid)
+ 
+ 	arg.buf = &semds;
+ 	if (semctl(semid, 0, IPC_STAT, arg)) {
+-		bb_perror_msg("semctl");
++		bb_simple_perror_msg("semctl");
+ 		return;
+ 	}
+ 
+@@ -555,7 +555,7 @@ static void print_sem(int semid)
+ 		zcnt = semctl(semid, i, GETZCNT, arg);
+ 		pid = semctl(semid, i, GETPID, arg);
+ 		if (val < 0 || ncnt < 0 || zcnt < 0 || pid < 0) {
+-			bb_perror_msg_and_die("semctl");
++			bb_simple_perror_msg_and_die("semctl");
+ 		}
+ 		printf("%-10u %-10d %-10d %-10d %-10d\n", i, val, ncnt, zcnt, pid);
+ 	}
+diff --git a/util-linux/last.c b/util-linux/last.c
+index 689aa7a34..24ce7a8d8 100644
+--- a/util-linux/last.c
++++ b/util-linux/last.c
+@@ -100,7 +100,7 @@ int last_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
+ 	pos = lseek(file, pos - sizeof(ut), SEEK_SET);
+ 	while ((n = full_read(file, &ut, sizeof(ut))) > 0) {
+ 		if (n != sizeof(ut)) {
+-			bb_perror_msg_and_die("short read");
++			bb_simple_perror_msg_and_die("short read");
+ 		}
+ 		n = index_in_strings(_ut_lin, ut.ut_line);
+ 		if (n == _TILDE) { /* '~' */
+diff --git a/util-linux/losetup.c b/util-linux/losetup.c
+index 5dc757074..cc6c2b1d5 100644
+--- a/util-linux/losetup.c
++++ b/util-linux/losetup.c
+@@ -118,13 +118,13 @@ int losetup_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 		n = get_free_loop();
+ 		if (n == -1)
+-			bb_error_msg_and_die("no free loop devices");
++			bb_simple_error_msg_and_die("no free loop devices");
+ 		if (n < 0) /* n == -2: no /dev/loop-control, use legacy method */
+ 			n = 0;
+ 		/* or: n >= 0: the number of next free loopdev, just verify it */
+ 		do {
+ 			if (n > MAX_LOOP_NUM)
+-				bb_error_msg_and_die("no free loop devices");
++				bb_simple_error_msg_and_die("no free loop devices");
+ 			sprintf(dev, LOOP_FORMAT, n++);
+ 			s = query_loop(dev);
+ 			free(s);
+diff --git a/util-linux/mdev.c b/util-linux/mdev.c
+index 9cb3586f1..207a112c1 100644
+--- a/util-linux/mdev.c
++++ b/util-linux/mdev.c
+@@ -250,18 +250,24 @@
+ 
+ #if DEBUG_LVL >= 1
+ # define dbg1(...) do { if (G.verbose) bb_error_msg(__VA_ARGS__); } while(0)
++# define dbg1s(msg) do { if (G.verbose) bb_simple_error_msg(msg); } while(0)
+ #else
+ # define dbg1(...) ((void)0)
++# define dbg1s(msg) ((void)0)
+ #endif
+ #if DEBUG_LVL >= 2
+ # define dbg2(...) do { if (G.verbose >= 2) bb_error_msg(__VA_ARGS__); } while(0)
++# define dbg2s(msg) do { if (G.verbose >= 2) bb_simple_error_msg(msg); } while(0)
+ #else
+ # define dbg2(...) ((void)0)
++# define dbg2s(msg) ((void)0)
+ #endif
+ #if DEBUG_LVL >= 3
+ # define dbg3(...) do { if (G.verbose >= 3) bb_error_msg(__VA_ARGS__); } while(0)
++# define dbg3s(msg) do { if (G.verbose >= 3) bb_simple_error_msg(msg); } while(0)
+ #else
+ # define dbg3(...) ((void)0)
++# define dbg3s(msg) ((void)0)
+ #endif
+ 
+ 
+@@ -1021,7 +1027,7 @@ wait_for_seqfile(unsigned expected_seq)
+ 			/* seed file: write out seq ASAP */
+ 			xwrite_str(seq_fd, utoa(expected_seq));
+ 			xlseek(seq_fd, 0, SEEK_SET);
+-			dbg2("first seq written");
++			dbg2s("first seq written");
+ 			break;
+ 		}
+ 		seqbufnum = atoll(seqbuf);
+@@ -1165,7 +1171,7 @@ static void daemon_loop(char *temp, int fd)
+ 
+ 		len = safe_read(fd, netbuf, sizeof(netbuf) - 1);
+ 		if (len < 0) {
+-			bb_perror_msg_and_die("read");
++			bb_simple_perror_msg_and_die("read");
+ 		}
+ 		end = netbuf + len;
+ 		*end = '\0';
+diff --git a/util-linux/mesg.c b/util-linux/mesg.c
+index c7b696853..8c032555b 100644
+--- a/util-linux/mesg.c
++++ b/util-linux/mesg.c
+@@ -65,7 +65,7 @@ int mesg_main(int argc UNUSED_PARAM, char **argv)
+ 	 */
+ 
+ 	if (!isatty(STDIN_FILENO))
+-		bb_error_msg_and_die("not a tty");
++		bb_simple_error_msg_and_die("not a tty");
+ 
+ 	xfstat(STDIN_FILENO, &sb, "stdin");
+ 	if (c == 0) {
+diff --git a/util-linux/mkfs_ext2.c b/util-linux/mkfs_ext2.c
+index 845ba0a24..d568f4be5 100644
+--- a/util-linux/mkfs_ext2.c
++++ b/util-linux/mkfs_ext2.c
+@@ -266,7 +266,7 @@ int mkfs_ext2_main(int argc UNUSED_PARAM, char **argv)
+ 	// N.B. what if we format a file? find_mount_point will return false negative since
+ 	// it is loop block device which is mounted!
+ 	if (find_mount_point(argv[0], 0))
+-		bb_error_msg_and_die("can't format mounted filesystem");
++		bb_simple_error_msg_and_die("can't format mounted filesystem");
+ 
+ 	// get size in kbytes
+ 	kilobytes = get_volume_size_in_bytes(fd, argv[1], 1024, /*extend:*/ !(option_mask32 & OPT_n)) / 1024;
+@@ -326,11 +326,11 @@ int mkfs_ext2_main(int argc UNUSED_PARAM, char **argv)
+ 	kilobytes >>= (blocksize_log2 - EXT2_MIN_BLOCK_LOG_SIZE);
+ 	nblocks = kilobytes;
+ 	if (nblocks != kilobytes)
+-		bb_error_msg_and_die("block count doesn't fit in 32 bits");
++		bb_simple_error_msg_and_die("block count doesn't fit in 32 bits");
+ #define kilobytes kilobytes_unused_after_this
+ 	// Experimentally, standard mke2fs won't work on images smaller than 60k
+ 	if (nblocks < 60)
+-		bb_error_msg_and_die("need >= 60 blocks");
++		bb_simple_error_msg_and_die("need >= 60 blocks");
+ 
+ 	// How many reserved blocks?
+ 	if (reserved_percent > 50)
+diff --git a/util-linux/mkfs_minix.c b/util-linux/mkfs_minix.c
+index e191acbd0..8f791cf66 100644
+--- a/util-linux/mkfs_minix.c
++++ b/util-linux/mkfs_minix.c
+@@ -262,7 +262,7 @@ static int get_free_block(void)
+ 	int blk;
+ 
+ 	if (G.used_good_blocks + 1 >= MAX_GOOD_BLOCKS)
+-		bb_error_msg_and_die("too many bad blocks");
++		bb_simple_error_msg_and_die("too many bad blocks");
+ 	if (G.used_good_blocks)
+ 		blk = G.good_blocks_table[G.used_good_blocks - 1] + 1;
+ 	else
+@@ -270,7 +270,7 @@ static int get_free_block(void)
+ 	while (blk < SB_ZONES && zone_in_use(blk))
+ 		blk++;
+ 	if (blk >= SB_ZONES)
+-		bb_error_msg_and_die("not enough good blocks");
++		bb_simple_error_msg_and_die("not enough good blocks");
+ 	G.good_blocks_table[G.used_good_blocks] = blk;
+ 	G.used_good_blocks++;
+ 	return blk;
+@@ -342,7 +342,7 @@ static void make_bad_inode(void)
+ 				goto end_bad;
+ 		}
+ 	}
+-	bb_error_msg_and_die("too many bad blocks");
++	bb_simple_error_msg_and_die("too many bad blocks");
+  end_bad:
+ 	if (ind)
+ 		write_block(ind, (char *) ind_block);
+@@ -398,7 +398,7 @@ static void make_bad_inode2(void)
+ 		}
+ 	}
+ 	/* Could make triple indirect block here */
+-	bb_error_msg_and_die("too many bad blocks");
++	bb_simple_error_msg_and_die("too many bad blocks");
+  end_bad:
+ 	if (ind)
+ 		write_block(ind, (char *) ind_block);
+@@ -514,7 +514,7 @@ static void check_blocks(void)
+ 		if (got == try)
+ 			continue;
+ 		if (G.currently_testing < SB_FIRSTZONE)
+-			bb_error_msg_and_die("bad blocks before data-area: cannot make fs");
++			bb_simple_error_msg_and_die("bad blocks before data-area: cannot make fs");
+ 		mark_zone(G.currently_testing);
+ 		G.badblocks++;
+ 		G.currently_testing++;
+@@ -588,7 +588,7 @@ static void setup_tables(void)
+ 		SB_ZMAPS = sb_zmaps;
+ 		/* new SB_ZMAPS, need to recalc NORM_FIRSTZONE */
+ 	} while (--i);
+-	bb_error_msg_and_die("incompatible size/inode count, try different -i N");
++	bb_simple_error_msg_and_die("incompatible size/inode count, try different -i N");
+  got_it:
+ 
+ 	SB_FIRSTZONE = norm_firstzone;
+@@ -623,10 +623,10 @@ int mkfs_minix_main(int argc UNUSED_PARAM, char **argv)
+ 	G.magic = MINIX1_SUPER_MAGIC2;
+ 
+ 	if (INODE_SIZE1 * MINIX1_INODES_PER_BLOCK != BLOCK_SIZE)
+-		bb_error_msg_and_die("bad inode size");
++		bb_simple_error_msg_and_die("bad inode size");
+ #if ENABLE_FEATURE_MINIX2
+ 	if (INODE_SIZE2 * MINIX2_INODES_PER_BLOCK != BLOCK_SIZE)
+-		bb_error_msg_and_die("bad inode size");
++		bb_simple_error_msg_and_die("bad inode size");
+ #endif
+ 
+ 	opt = getopt32(argv, "ci:l:n:+v", &str_i, &listfile, &G.namelen);
+@@ -644,7 +644,7 @@ int mkfs_minix_main(int argc UNUSED_PARAM, char **argv)
+ #if ENABLE_FEATURE_MINIX2
+ 		version2 = 1;
+ #else
+-		bb_error_msg_and_die("not compiled with minix v2 support");
++		bb_simple_error_msg_and_die("not compiled with minix v2 support");
+ #endif
+ 	}
+ 
+@@ -654,14 +654,14 @@ int mkfs_minix_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	/* Check if it is mounted */
+ 	if (find_mount_point(G.device_name, 0))
+-		bb_error_msg_and_die("can't format mounted filesystem");
++		bb_simple_error_msg_and_die("can't format mounted filesystem");
+ 
+ 	xmove_fd(xopen(G.device_name, O_RDWR), dev_fd);
+ 
+ 	G.total_blocks = get_volume_size_in_bytes(dev_fd, argv[1], 1024, /*extend:*/ 1) / 1024;
+ 
+ 	if (G.total_blocks < 10)
+-		bb_error_msg_and_die("must have at least 10 blocks");
++		bb_simple_error_msg_and_die("must have at least 10 blocks");
+ 
+ 	if (version2) {
+ 		G.magic = MINIX2_SUPER_MAGIC2;
+diff --git a/util-linux/mkfs_reiser.c b/util-linux/mkfs_reiser.c
+index b4c8dda6f..d2eaf5f94 100644
+--- a/util-linux/mkfs_reiser.c
++++ b/util-linux/mkfs_reiser.c
+@@ -178,7 +178,7 @@ int mkfs_reiser_main(int argc UNUSED_PARAM, char **argv)
+ 	// N.B. what if we format a file? find_mount_point will return false negative since
+ 	// it is loop block device which is mounted!
+ 	if (find_mount_point(argv[0], 0))
+-		bb_error_msg_and_die("can't format mounted filesystem");
++		bb_simple_error_msg_and_die("can't format mounted filesystem");
+ 
+ 	// open the device, get size in blocks
+ 	blocks = get_volume_size_in_bytes(fd, argv[1], blocksize, /*extend:*/ 1) / blocksize;
+diff --git a/util-linux/mkfs_vfat.c b/util-linux/mkfs_vfat.c
+index b760fb2aa..16c1fac00 100644
+--- a/util-linux/mkfs_vfat.c
++++ b/util-linux/mkfs_vfat.c
+@@ -278,7 +278,7 @@ int mkfs_vfat_main(int argc UNUSED_PARAM, char **argv)
+ 	if (!S_ISBLK(st.st_mode)) {
+ 		if (!S_ISREG(st.st_mode)) {
+ 			if (!argv[1])
+-				bb_error_msg_and_die("image size must be specified");
++				bb_simple_error_msg_and_die("image size must be specified");
+ 		}
+ 		// not a block device, skip bad sectors check
+ 		opts &= ~OPT_c;
+@@ -399,7 +399,7 @@ int mkfs_vfat_main(int argc UNUSED_PARAM, char **argv)
+ 	// "mkdosfs -v -F 32 image5k 5" is the minimum:
+ 	// 2 sectors for FATs and 2 data sectors
+ 	if ((off_t)(volume_size_sect - reserved_sect) < 4)
+-		bb_error_msg_and_die("the image is too small for FAT32");
++		bb_simple_error_msg_and_die("the image is too small for FAT32");
+ 	sect_per_fat = 1;
+ 	while (1) {
+ 		while (1) {
+@@ -439,7 +439,7 @@ int mkfs_vfat_main(int argc UNUSED_PARAM, char **argv)
+ 		}
+  next:
+ 		if (sect_per_clust == 128)
+-			bb_error_msg_and_die("can't make FAT32 with >128 sectors/cluster");
++			bb_simple_error_msg_and_die("can't make FAT32 with >128 sectors/cluster");
+ 		sect_per_clust *= 2;
+ 		sect_per_fat = (sect_per_fat / 2) | 1;
+ 	}
+diff --git a/util-linux/mkswap.c b/util-linux/mkswap.c
+index 38413606d..9e51a1dcc 100644
+--- a/util-linux/mkswap.c
++++ b/util-linux/mkswap.c
+@@ -75,7 +75,7 @@ static void mkswap_selinux_setcontext(int fd, const char *path)
+ 	}
+ 	return;
+  error:
+-	bb_perror_msg_and_die("SELinux relabeling failed");
++	bb_simple_perror_msg_and_die("SELinux relabeling failed");
+ }
+ #else
+ # define mkswap_selinux_setcontext(fd, path) ((void)0)
+diff --git a/util-linux/mount.c b/util-linux/mount.c
+index e6bad7c2c..84c85c057 100644
+--- a/util-linux/mount.c
++++ b/util-linux/mount.c
+@@ -483,7 +483,7 @@ static void FAST_FUNC update_mtab_entry_on_move(const struct mntent *mp)
+ 
+ 	mountTable = setmntent(bb_path_mtab_file, "r");
+ 	if (!mountTable) {
+-		bb_perror_msg(bb_path_mtab_file);
++		bb_simple_perror_msg(bb_path_mtab_file);
+ 		return;
+ 	}
+ 
+@@ -511,7 +511,7 @@ static void FAST_FUNC update_mtab_entry_on_move(const struct mntent *mp)
+ 		}
+ 		endmntent(mountTable);
+ 	} else if (errno != EROFS)
+-		bb_perror_msg(bb_path_mtab_file);
++		bb_simple_perror_msg(bb_path_mtab_file);
+ 
+ 	if (ENABLE_FEATURE_CLEAN_UP) {
+ 		for (i = 0; i < count; i++) {
+@@ -739,7 +739,7 @@ static int mount_it_now(struct mntent *mp, unsigned long vfsflags, char *filtero
+ 	// Abort entirely if permission denied.
+ 
+ 	if (rc && errno == EPERM)
+-		bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
++		bb_simple_error_msg_and_die(bb_msg_perm_denied_are_you_root);
+ 
+ 	// If the mount was successful, and we're maintaining an old-style
+ 	// mtab file by hand, add the new entry to it now.
+@@ -751,7 +751,7 @@ static int mount_it_now(struct mntent *mp, unsigned long vfsflags, char *filtero
+ 		int i;
+ 
+ 		if (!mountTable) {
+-			bb_perror_msg(bb_path_mtab_file);
++			bb_simple_perror_msg(bb_path_mtab_file);
+ 			goto ret;
+ 		}
+ 
+@@ -1288,18 +1288,18 @@ static NOINLINE int nfsmount(struct mntent *mp, unsigned long vfsflags, char *fi
+ 	s = strchr(hostname, ',');
+ 	if (s) {
+ 		*s = '\0';
+-		bb_error_msg("warning: multiple hostnames not supported");
++		bb_simple_error_msg("warning: multiple hostnames not supported");
+ 	}
+ 
+ 	server_addr.sin_family = AF_INET;
+ 	if (!inet_aton(hostname, &server_addr.sin_addr)) {
+ 		hp = gethostbyname(hostname);
+ 		if (hp == NULL) {
+-			bb_herror_msg("%s", hostname);
++			bb_simple_herror_msg(hostname);
+ 			goto fail;
+ 		}
+ 		if (hp->h_length != (int)sizeof(struct in_addr)) {
+-			bb_error_msg_and_die("only IPv4 is supported");
++			bb_simple_error_msg_and_die("only IPv4 is supported");
+ 		}
+ 		memcpy(&server_addr.sin_addr, hp->h_addr_list[0], sizeof(struct in_addr));
+ 	}
+@@ -1389,7 +1389,7 @@ static NOINLINE int nfsmount(struct mntent *mp, unsigned long vfsflags, char *fi
+ 				else if (is_prefixed_with(opteq, "udp"))
+ 					tcp = 0;
+ 				else
+-					bb_error_msg("warning: unrecognized proto= option");
++					bb_simple_error_msg("warning: unrecognized proto= option");
+ 				continue;
+ 			case 20: // "addr" - ignore
+ 				continue;
+@@ -1522,7 +1522,7 @@ static NOINLINE int nfsmount(struct mntent *mp, unsigned long vfsflags, char *fi
+ 				if (nfs_mount_version >= 3)
+ 					nolock = !val;
+ 				else
+-					bb_error_msg("warning: option nolock is not supported");
++					bb_simple_error_msg("warning: option nolock is not supported");
+ 				break;
+ 			case 11: //rdirplus
+ 				nordirplus = !val;
+@@ -1590,11 +1590,11 @@ static NOINLINE int nfsmount(struct mntent *mp, unsigned long vfsflags, char *fi
+ 		} else {
+ 			hp = gethostbyname(mounthost);
+ 			if (hp == NULL) {
+-				bb_herror_msg("%s", mounthost);
++				bb_simple_herror_msg(mounthost);
+ 				goto fail;
+ 			}
+ 			if (hp->h_length != (int)sizeof(struct in_addr)) {
+-				bb_error_msg_and_die("only IPv4 is supported");
++				bb_simple_error_msg_and_die("only IPv4 is supported");
+ 			}
+ 			mount_server_addr.sin_family = AF_INET;
+ 			memcpy(&mount_server_addr.sin_addr, hp->h_addr_list[0], sizeof(struct in_addr));
+@@ -1767,18 +1767,18 @@ static NOINLINE int nfsmount(struct mntent *mp, unsigned long vfsflags, char *fi
+ 	/* Create nfs socket for kernel */
+ 	if (tcp) {
+ 		if (nfs_mount_version < 3) {
+-			bb_error_msg("NFS over TCP is not supported");
++			bb_simple_error_msg("NFS over TCP is not supported");
+ 			goto fail;
+ 		}
+ 		fsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ 	} else
+ 		fsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ 	if (fsock < 0) {
+-		bb_perror_msg("nfs socket");
++		bb_simple_perror_msg("nfs socket");
+ 		goto fail;
+ 	}
+ 	if (bindresvport(fsock, 0) < 0) {
+-		bb_perror_msg("nfs bindresvport");
++		bb_simple_perror_msg("nfs bindresvport");
+ 		goto fail;
+ 	}
+ 	if (port == 0) {
+@@ -2047,9 +2047,9 @@ static int singlemount(struct mntent *mp, int ignore_busy)
+ 			);
+ 			if (loopfd < 0) {
+ 				if (errno == EPERM || errno == EACCES)
+-					bb_error_msg(bb_msg_perm_denied_are_you_root);
++					bb_simple_error_msg(bb_msg_perm_denied_are_you_root);
+ 				else
+-					bb_perror_msg("can't setup loop device");
++					bb_simple_perror_msg("can't setup loop device");
+ 				return errno;
+ 			}
+ 
+@@ -2255,7 +2255,7 @@ int mount_main(int argc UNUSED_PARAM, char **argv)
+ 		// argument when we get it.
+ 		if (argv[1]) {
+ 			if (nonroot)
+-				bb_error_msg_and_die(bb_msg_you_must_be_root);
++				bb_simple_error_msg_and_die(bb_msg_you_must_be_root);
+ 			mtpair->mnt_fsname = argv[0];
+ 			mtpair->mnt_dir = argv[1];
+ 			mtpair->mnt_type = fstype;
+@@ -2272,7 +2272,7 @@ int mount_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	cmdopt_flags = parse_mount_options(cmdopts, NULL);
+ 	if (nonroot && (cmdopt_flags & ~MS_SILENT)) // Non-root users cannot specify flags
+-		bb_error_msg_and_die(bb_msg_you_must_be_root);
++		bb_simple_error_msg_and_die(bb_msg_you_must_be_root);
+ 
+ 	// If we have a shared subtree flag, don't worry about fstab or mtab.
+ 	if (ENABLE_FEATURE_MOUNT_FLAGS
+@@ -2337,7 +2337,7 @@ int mount_main(int argc UNUSED_PARAM, char **argv)
+ 			// No, mount -a won't mount anything,
+ 			// even user mounts, for mere humans
+ 			if (nonroot)
+-				bb_error_msg_and_die(bb_msg_you_must_be_root);
++				bb_simple_error_msg_and_die(bb_msg_you_must_be_root);
+ 
+ 			// Does type match? (NULL matches always)
+ 			if (!fstype_matches(mtcur->mnt_type, fstype))
+@@ -2417,7 +2417,7 @@ int mount_main(int argc UNUSED_PARAM, char **argv)
+ 			// fstab must have "users" or "user"
+ 			l = parse_mount_options(mtcur->mnt_opts, NULL);
+ 			if (!(l & MOUNT_USERS))
+-				bb_error_msg_and_die(bb_msg_you_must_be_root);
++				bb_simple_error_msg_and_die(bb_msg_you_must_be_root);
+ 		}
+ 
+ 		//util-linux-2.12 does not do this check.
+diff --git a/util-linux/nsenter.c b/util-linux/nsenter.c
+index 4eeaa9f3e..304f2d748 100644
+--- a/util-linux/nsenter.c
++++ b/util-linux/nsenter.c
+@@ -257,7 +257,7 @@ int nsenter_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	if (opts & OPT_setgid) {
+ 		if (setgroups(0, NULL) < 0 && setgroups_failed)
+-			bb_perror_msg_and_die("setgroups");
++			bb_simple_perror_msg_and_die("setgroups");
+ 		xsetgid(gid);
+ 	}
+ 	if (opts & OPT_setuid)
+diff --git a/util-linux/rdate.c b/util-linux/rdate.c
+index 70f829e7f..41aade5ea 100644
+--- a/util-linux/rdate.c
++++ b/util-linux/rdate.c
+@@ -33,7 +33,7 @@ enum { RFC_868_BIAS = 2208988800UL };
+ 
+ static void socket_timeout(int sig UNUSED_PARAM)
+ {
+-	bb_error_msg_and_die("timeout connecting to time server");
++	bb_simple_error_msg_and_die("timeout connecting to time server");
+ }
+ 
+ static time_t askremotedate(const char *host)
+@@ -94,10 +94,10 @@ int rdate_main(int argc UNUSED_PARAM, char **argv)
+ 
+ 	if (!(flags & 2)) { /* no -p (-s may be present) */
+ 		if (time(NULL) == remote_time)
+-			bb_error_msg("current time matches remote time");
++			bb_simple_error_msg("current time matches remote time");
+ 		else
+ 			if (stime(&remote_time) < 0)
+-				bb_perror_msg_and_die("can't set time of day");
++				bb_simple_perror_msg_and_die("can't set time of day");
+ 	}
+ 
+ 	if (flags != 1) /* not lone -s */
+diff --git a/util-linux/readprofile.c b/util-linux/readprofile.c
+index cab2c4319..c4ea374be 100644
+--- a/util-linux/readprofile.c
++++ b/util-linux/readprofile.c
+@@ -142,7 +142,7 @@ int readprofile_main(int argc UNUSED_PARAM, char **argv)
+ 				small++;
+ 		}
+ 		if (big > small) {
+-			bb_error_msg("assuming reversed byte order, "
++			bb_simple_error_msg("assuming reversed byte order, "
+ 				"use -n to force native byte order");
+ 			BUILD_BUG_ON(sizeof(*p) > 8);
+ 			for (p = buf; p < buf+len; p++) {
+@@ -204,7 +204,7 @@ int readprofile_main(int argc UNUSED_PARAM, char **argv)
+ 		}
+ 
+ 		if (indx >= len)
+-			bb_error_msg_and_die("profile address out of range. "
++			bb_simple_error_msg_and_die("profile address out of range. "
+ 					"Wrong map file?");
+ 
+ 		this = 0;
+diff --git a/util-linux/rtcwake.c b/util-linux/rtcwake.c
+index 29c440b82..cad0f9d64 100644
+--- a/util-linux/rtcwake.c
++++ b/util-linux/rtcwake.c
+@@ -230,7 +230,7 @@ int rtcwake_main(int argc UNUSED_PARAM, char **argv)
+ 		do {
+ 			ssize_t ret = safe_read(fd, &data, sizeof(data));
+ 			if (ret < 0) {
+-				bb_perror_msg("rtc read");
++				bb_simple_perror_msg("rtc read");
+ 				break;
+ 			}
+ 		} while (!(data & RTC_AF));
+diff --git a/util-linux/setpriv.c b/util-linux/setpriv.c
+index b69b8cbb6..e5cf96957 100644
+--- a/util-linux/setpriv.c
++++ b/util-linux/setpriv.c
+@@ -164,7 +164,7 @@ static void set_inh_caps(char *capstring)
+ 	}
+ 
+ 	if (capset(&caps.header, caps.data) != 0)
+-		bb_perror_msg_and_die("capset");
++		bb_simple_perror_msg_and_die("capset");
+ }
+ 
+ static void set_ambient_caps(char *string)
+@@ -178,10 +178,10 @@ static void set_ambient_caps(char *string)
+ 		idx = parse_cap(cap);
+ 		if (cap[0] == '+') {
+ 			if (prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_RAISE, idx, 0, 0) < 0)
+-				bb_perror_msg("cap_ambient_raise");
++				bb_simple_perror_msg("cap_ambient_raise");
+ 		} else {
+ 			if (prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_LOWER, idx, 0, 0) < 0)
+-				bb_perror_msg("cap_ambient_lower");
++				bb_simple_perror_msg("cap_ambient_lower");
+ 		}
+ 		cap = strtok(NULL, ",");
+ 	}
+@@ -236,7 +236,7 @@ static int dump(void)
+ 		unsigned idx = CAP_TO_INDEX(i);
+ 		if (idx >= caps.u32s) {
+ 			printf("\nindex: %u u32s: %u capability: %u\n", idx, caps.u32s, i);
+-			bb_error_msg_and_die("unsupported capability");
++			bb_simple_error_msg_and_die("unsupported capability");
+ 		}
+ 		if (caps.data[idx].inheritable & CAP_TO_MASK(i)) {
+ 			printf_cap(fmt, i);
+diff --git a/util-linux/switch_root.c b/util-linux/switch_root.c
+index ae9d412d1..a483893ed 100644
+--- a/util-linux/switch_root.c
++++ b/util-linux/switch_root.c
+@@ -117,7 +117,7 @@ static void drop_capset(int cap_idx)
+ 	getcaps(&caps);
+ 	caps.data[CAP_TO_INDEX(cap_idx)].inheritable &= ~CAP_TO_MASK(cap_idx);
+ 	if (capset(&caps.header, caps.data) != 0)
+-		bb_perror_msg_and_die("capset");
++		bb_simple_perror_msg_and_die("capset");
+ }
+ 
+ static void drop_bounding_set(int cap_idx)
+@@ -253,7 +253,7 @@ int switch_root_main(int argc UNUSED_PARAM, char **argv)
+ 	if ((unsigned)stfs.f_type != RAMFS_MAGIC
+ 	 && (unsigned)stfs.f_type != TMPFS_MAGIC
+ 	) {
+-		bb_error_msg_and_die("root filesystem is not ramfs/tmpfs");
++		bb_simple_error_msg_and_die("root filesystem is not ramfs/tmpfs");
+ 	}
+ 
+ 	if (!dry_run) {
+@@ -263,7 +263,7 @@ int switch_root_main(int argc UNUSED_PARAM, char **argv)
+ 		// Overmount / with newdir and chroot into it
+ 		if (mount(".", "/", NULL, MS_MOVE, NULL)) {
+ 			// For example, fails when newroot is not a mountpoint
+-			bb_perror_msg_and_die("error moving root");
++			bb_simple_perror_msg_and_die("error moving root");
+ 		}
+ 	}
+ 	xchroot(".");
+diff --git a/util-linux/uevent.c b/util-linux/uevent.c
+index 2f8990ed9..7a1d7d4a7 100644
+--- a/util-linux/uevent.c
++++ b/util-linux/uevent.c
+@@ -75,12 +75,12 @@ int uevent_main(int argc UNUSED_PARAM, char **argv)
+ 					MAP_PRIVATE | MAP_ANON,
+ 					/* ignored: */ -1, 0);
+ 		if (netbuf == MAP_FAILED)
+-			bb_perror_msg_and_die("mmap");
++			bb_simple_perror_msg_and_die("mmap");
+ 
+ 		// Here we block, possibly for a very long time
+ 		len = safe_read(fd, netbuf, BUFFER_SIZE - 1);
+ 		if (len < 0)
+-			bb_perror_msg_and_die("read");
++			bb_simple_perror_msg_and_die("read");
+ 		end = netbuf + len;
+ 		*end = '\0';
+ 
+diff --git a/util-linux/unshare.c b/util-linux/unshare.c
+index 61fc71197..a943e7b03 100644
+--- a/util-linux/unshare.c
++++ b/util-linux/unshare.c
+@@ -239,7 +239,7 @@ int unshare_main(int argc UNUSED_PARAM, char **argv)
+ 	if (setgrp_str) {
+ 		if (strcmp(setgrp_str, "allow") == 0) {
+ 			if (opts & OPT_map_root) {
+-				bb_error_msg_and_die(
++				bb_simple_error_msg_and_die(
+ 					"--setgroups=allow and --map-root-user "
+ 					"are mutually exclusive"
+ 				);
+-- 
+2.18.2
+
diff --git a/package/busybox/0004-date-Use-64-prefix-syscall-if-we-have-to.patch b/package/busybox/0004-date-Use-64-prefix-syscall-if-we-have-to.patch
new file mode 100644
index 0000000000..528cbeb7ec
--- /dev/null
+++ b/package/busybox/0004-date-Use-64-prefix-syscall-if-we-have-to.patch
@@ -0,0 +1,57 @@
+From b7b7452f292f03eefafa6fd1da9bcfc933dee15a Mon Sep 17 00:00:00 2001
+From: Alistair Francis <alistair.francis@wdc.com>
+Date: Wed, 18 Sep 2019 09:28:49 -0700
+Subject: [PATCH] date: Use 64 prefix syscall if we have to
+
+Some 32-bit architectures no longer have the 32-bit time_t syscalls.
+Instead they have suffixed syscalls that returns a 64-bit time_t. If
+the architecture doesn't have the non-suffixed syscall and is using a
+64-bit time_t let's use the suffixed syscall instead.
+
+This fixes build issues when building for RISC-V 32-bit with 5.1+ kernel
+headers.
+
+If an architecture only supports the suffixed syscalls, but is still
+using a 32-bit time_t fall back to the libc call.
+
+Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
+Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
+---
+ coreutils/date.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/coreutils/date.c b/coreutils/date.c
+index feb400430..731241536 100644
+--- a/coreutils/date.c
++++ b/coreutils/date.c
+@@ -36,7 +36,7 @@
+ //config:# defaults to "no": stat's nanosecond field is a bit non-portable
+ //config:config FEATURE_DATE_NANO
+ //config:	bool "Support %[num]N nanosecond format specifier"
+-//config:	default n  # syscall(__NR_clock_gettime)
++//config:	default n  # syscall(__NR_clock_gettime) or syscall(__NR_clock_gettime64)
+ //config:	depends on DATE
+ //config:	select PLATFORM_LINUX
+ //config:	help
+@@ -271,10 +271,17 @@ int date_main(int argc UNUSED_PARAM, char **argv)
+ 		 */
+ #endif
+ 	} else {
+-#if ENABLE_FEATURE_DATE_NANO
++#if ENABLE_FEATURE_DATE_NANO && defined(__NR_clock_gettime)
+ 		/* libc has incredibly messy way of doing this,
+ 		 * typically requiring -lrt. We just skip all this mess */
+ 		syscall(__NR_clock_gettime, CLOCK_REALTIME, &ts);
++#elif ENABLE_FEATURE_DATE_NANO && __TIMESIZE == 64
++		/* Let's only support the 64 suffix syscalls for 64-bit time_t.
++		 * This simplifies the code for us as we don't need to convert
++		 * between 64-bit and 32-bit. We also don't have a way to
++		 * report overflow errors here.
++		 */
++		syscall(__NR_clock_gettime64, CLOCK_REALTIME, &ts);
+ #else
+ 		time(&ts.tv_sec);
+ #endif
+-- 
+2.18.2
+
diff --git a/package/busybox/0005-time-Use-64-prefix-syscall-if-we-have-to.patch b/package/busybox/0005-time-Use-64-prefix-syscall-if-we-have-to.patch
new file mode 100644
index 0000000000..b4b867d4d6
--- /dev/null
+++ b/package/busybox/0005-time-Use-64-prefix-syscall-if-we-have-to.patch
@@ -0,0 +1,46 @@
+From 902d3992922fc8db8495d5fb30a4581711b60c62 Mon Sep 17 00:00:00 2001
+From: Alistair Francis <alistair.francis@wdc.com>
+Date: Wed, 18 Sep 2019 09:28:50 -0700
+Subject: [PATCH] time: Use 64 prefix syscall if we have to
+
+Some 32-bit architectures no longer have the 32-bit time_t syscalls.
+Instead they have suffixed syscalls that returns a 64-bit time_t. If
+the architecture doesn't have the non-suffixed syscall and is using a
+64-bit time_t let's use the suffixed syscall instead.
+
+This fixes build issues when building for RISC-V 32-bit with 5.1+ kernel
+headers.
+
+If an architecture only supports the suffixed syscalls, but is still
+using a 32-bit time_t report a compilation error. This avoids us have to
+deal with converting between 64-bit and 32-bit values. There are
+currently no architectures where this is the case.
+
+Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
+Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
+---
+ libbb/time.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/libbb/time.c b/libbb/time.c
+index cab0ad602..b6fcae28b 100644
+--- a/libbb/time.c
++++ b/libbb/time.c
+@@ -257,7 +257,14 @@ char* FAST_FUNC strftime_YYYYMMDDHHMMSS(char *buf, unsigned len, time_t *tp)
+  * typically requiring -lrt. We just skip all this mess */
+ static void get_mono(struct timespec *ts)
+ {
++#if defined(__NR_clock_gettime)
+ 	if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, ts))
++#elif __TIMESIZE == 64
++	if (syscall(__NR_clock_gettime64, CLOCK_MONOTONIC, ts))
++#else
++# error "We currently don't support architectures without " \
++	"the __NR_clock_gettime syscall and 32-bit time_t"
++#endif
+ 		bb_simple_error_msg_and_die("clock_gettime(MONOTONIC) failed");
+ }
+ unsigned long long FAST_FUNC monotonic_ns(void)
+-- 
+2.18.2
+
diff --git a/package/busybox/0006-runsv-Use-64-prefix-syscall-if-we-have-to.patch b/package/busybox/0006-runsv-Use-64-prefix-syscall-if-we-have-to.patch
new file mode 100644
index 0000000000..aa4dfb0a44
--- /dev/null
+++ b/package/busybox/0006-runsv-Use-64-prefix-syscall-if-we-have-to.patch
@@ -0,0 +1,46 @@
+From ad27d44ebe950335616f37e36863469dc181b455 Mon Sep 17 00:00:00 2001
+From: Alistair Francis <alistair.francis@wdc.com>
+Date: Wed, 18 Sep 2019 09:28:51 -0700
+Subject: [PATCH] runsv: Use 64 prefix syscall if we have to
+
+Some 32-bit architectures no longer have the 32-bit time_t syscalls.
+Instead they have suffixed syscalls that returns a 64-bit time_t. If
+the architecture doesn't have the non-suffixed syscall and is using a
+64-bit time_t let's use the suffixed syscall instead.
+
+This fixes build issues when building for RISC-V 32-bit with 5.1+ kernel
+headers.
+
+If an architecture only supports the suffixed syscalls, but is still
+using a 32-bit time_t report a compilation error. This avoids us have to
+deal with converting between 64-bit and 32-bit values. There are
+currently no architectures where this is the case.
+
+Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
+Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
+---
+ runit/runsv.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/runit/runsv.c b/runit/runsv.c
+index ccc762d78..737909b0e 100644
+--- a/runit/runsv.c
++++ b/runit/runsv.c
+@@ -55,7 +55,14 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  * typically requiring -lrt. We just skip all this mess */
+ static void gettimeofday_ns(struct timespec *ts)
+ {
++#if defined(__NR_clock_gettime)
+ 	syscall(__NR_clock_gettime, CLOCK_REALTIME, ts);
++#elif __TIMESIZE == 64
++	syscall(__NR_clock_gettime64, CLOCK_REALTIME, ts);
++#else
++# error "We currently don't support architectures without " \
++	"the __NR_clock_gettime syscall and 32-bit time_t"
++#endif
+ }
+ #else
+ static void gettimeofday_ns(struct timespec *ts)
+-- 
+2.18.2
+
diff --git a/package/busybox/0007-Remove-syscall-wrappers-around-clock_gettime-closes-.patch b/package/busybox/0007-Remove-syscall-wrappers-around-clock_gettime-closes-.patch
new file mode 100644
index 0000000000..af568c70a3
--- /dev/null
+++ b/package/busybox/0007-Remove-syscall-wrappers-around-clock_gettime-closes-.patch
@@ -0,0 +1,130 @@
+From be5a505d771a77c640acc35ceaa470c80e62f954 Mon Sep 17 00:00:00 2001
+From: Denys Vlasenko <vda.linux@googlemail.com>
+Date: Thu, 24 Oct 2019 16:26:55 +0200
+Subject: [PATCH] Remove syscall wrappers around clock_gettime, closes 12091
+
+12091 "Direct use of __NR_clock_gettime is not time64-safe".
+
+function                                             old     new   delta
+runsv_main                                          1698    1712     +14
+startservice                                         378     383      +5
+get_mono                                              31      25      -6
+date_main                                            932     926      -6
+gettimeofday_ns                                       17       -     -17
+------------------------------------------------------------------------------
+(add/remove: 0/1 grow/shrink: 2/2 up/down: 19/-29)            Total: -10 bytes
+
+Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
+---
+ Makefile.flags   |  6 ++++--
+ coreutils/date.c | 16 +++-------------
+ libbb/time.c     | 11 +----------
+ runit/runsv.c    | 11 +----------
+ 4 files changed, 9 insertions(+), 35 deletions(-)
+
+diff --git a/Makefile.flags b/Makefile.flags
+index 6f6142cc5..bea464753 100644
+--- a/Makefile.flags
++++ b/Makefile.flags
+@@ -129,10 +129,12 @@ endif
+ # fall back to using a temp file:
+ CRYPT_AVAILABLE := $(shell echo 'int main(void){return 0;}' >crypttest.c; $(CC) $(CFLAGS) -lcrypt -o /dev/null crypttest.c >/dev/null 2>&1 && echo "y"; rm crypttest.c)
+ ifeq ($(CRYPT_AVAILABLE),y)
+-LDLIBS += m crypt
++LDLIBS += m rt crypt
+ else
+-LDLIBS += m
++LDLIBS += m rt
+ endif
++# libm may be needed for dc, awk, ntpd
++# librt may be needed for clock_gettime()
+ 
+ # libpam may use libpthread, libdl and/or libaudit.
+ # On some platforms that requires an explicit -lpthread, -ldl, -laudit.
+diff --git a/coreutils/date.c b/coreutils/date.c
+index 731241536..f7e9a8d0e 100644
+--- a/coreutils/date.c
++++ b/coreutils/date.c
+@@ -33,10 +33,9 @@
+ //config:	Enable option (-I) to output an ISO-8601 compliant
+ //config:	date/time string.
+ //config:
+-//config:# defaults to "no": stat's nanosecond field is a bit non-portable
+ //config:config FEATURE_DATE_NANO
+ //config:	bool "Support %[num]N nanosecond format specifier"
+-//config:	default n  # syscall(__NR_clock_gettime) or syscall(__NR_clock_gettime64)
++//config:	default n # stat's nanosecond field is a bit non-portable
+ //config:	depends on DATE
+ //config:	select PLATFORM_LINUX
+ //config:	help
+@@ -271,17 +270,8 @@ int date_main(int argc UNUSED_PARAM, char **argv)
+ 		 */
+ #endif
+ 	} else {
+-#if ENABLE_FEATURE_DATE_NANO && defined(__NR_clock_gettime)
+-		/* libc has incredibly messy way of doing this,
+-		 * typically requiring -lrt. We just skip all this mess */
+-		syscall(__NR_clock_gettime, CLOCK_REALTIME, &ts);
+-#elif ENABLE_FEATURE_DATE_NANO && __TIMESIZE == 64
+-		/* Let's only support the 64 suffix syscalls for 64-bit time_t.
+-		 * This simplifies the code for us as we don't need to convert
+-		 * between 64-bit and 32-bit. We also don't have a way to
+-		 * report overflow errors here.
+-		 */
+-		syscall(__NR_clock_gettime64, CLOCK_REALTIME, &ts);
++#if ENABLE_FEATURE_DATE_NANO
++		clock_gettime(CLOCK_REALTIME, &ts);
+ #else
+ 		time(&ts.tv_sec);
+ #endif
+diff --git a/libbb/time.c b/libbb/time.c
+index b6fcae28b..e66a9cba8 100644
+--- a/libbb/time.c
++++ b/libbb/time.c
+@@ -253,18 +253,9 @@ char* FAST_FUNC strftime_YYYYMMDDHHMMSS(char *buf, unsigned len, time_t *tp)
+ #define CLOCK_MONOTONIC 1
+ #endif
+ 
+-/* libc has incredibly messy way of doing this,
+- * typically requiring -lrt. We just skip all this mess */
+ static void get_mono(struct timespec *ts)
+ {
+-#if defined(__NR_clock_gettime)
+-	if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, ts))
+-#elif __TIMESIZE == 64
+-	if (syscall(__NR_clock_gettime64, CLOCK_MONOTONIC, ts))
+-#else
+-# error "We currently don't support architectures without " \
+-	"the __NR_clock_gettime syscall and 32-bit time_t"
+-#endif
++	if (clock_gettime(CLOCK_MONOTONIC, ts))
+ 		bb_simple_error_msg_and_die("clock_gettime(MONOTONIC) failed");
+ }
+ unsigned long long FAST_FUNC monotonic_ns(void)
+diff --git a/runit/runsv.c b/runit/runsv.c
+index 737909b0e..36d85101e 100644
+--- a/runit/runsv.c
++++ b/runit/runsv.c
+@@ -51,18 +51,9 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ #if ENABLE_MONOTONIC_SYSCALL
+ #include <sys/syscall.h>
+ 
+-/* libc has incredibly messy way of doing this,
+- * typically requiring -lrt. We just skip all this mess */
+ static void gettimeofday_ns(struct timespec *ts)
+ {
+-#if defined(__NR_clock_gettime)
+-	syscall(__NR_clock_gettime, CLOCK_REALTIME, ts);
+-#elif __TIMESIZE == 64
+-	syscall(__NR_clock_gettime64, CLOCK_REALTIME, ts);
+-#else
+-# error "We currently don't support architectures without " \
+-	"the __NR_clock_gettime syscall and 32-bit time_t"
+-#endif
++	clock_gettime(CLOCK_REALTIME, ts);
+ }
+ #else
+ static void gettimeofday_ns(struct timespec *ts)
+-- 
+2.18.2
+
diff --git a/package/busybox/0008-Remove-stime-function-calls.patch b/package/busybox/0008-Remove-stime-function-calls.patch
new file mode 100644
index 0000000000..c7f93695c0
--- /dev/null
+++ b/package/busybox/0008-Remove-stime-function-calls.patch
@@ -0,0 +1,93 @@
+From d3539be8f27b8cbfdfee460fe08299158f08bcd9 Mon Sep 17 00:00:00 2001
+From: Alistair Francis <alistair.francis@wdc.com>
+Date: Tue, 19 Nov 2019 13:06:40 +0100
+Subject: [PATCH] Remove stime() function calls
+
+stime() has been deprecated in glibc 2.31 and replaced with
+clock_settime(). Let's replace the stime() function calls with
+clock_settime() in preperation.
+
+function                                             old     new   delta
+rdate_main                                           197     224     +27
+clock_settime                                          -      27     +27
+date_main                                            926     941     +15
+stime                                                 37       -     -37
+------------------------------------------------------------------------------
+(add/remove: 2/2 grow/shrink: 2/0 up/down: 69/-37)             Total: 32 bytes
+
+Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
+Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
+---
+ coreutils/date.c         | 6 +++++-
+ libbb/missing_syscalls.c | 8 --------
+ util-linux/rdate.c       | 8 ++++++--
+ 3 files changed, 11 insertions(+), 11 deletions(-)
+
+diff --git a/coreutils/date.c b/coreutils/date.c
+index f7e9a8d0e..b9b7fd2cb 100644
+--- a/coreutils/date.c
++++ b/coreutils/date.c
+@@ -276,6 +276,9 @@ int date_main(int argc UNUSED_PARAM, char **argv)
+ 		time(&ts.tv_sec);
+ #endif
+ 	}
++#if !ENABLE_FEATURE_DATE_NANO
++	ts.tv_nsec = 0;
++#endif
+ 	localtime_r(&ts.tv_sec, &tm_time);
+ 
+ 	/* If date string is given, update tm_time, and maybe set date */
+@@ -298,9 +301,10 @@ int date_main(int argc UNUSED_PARAM, char **argv)
+ 		if (date_str[0] != '@')
+ 			tm_time.tm_isdst = -1;
+ 		ts.tv_sec = validate_tm_time(date_str, &tm_time);
++		ts.tv_nsec = 0;
+ 
+ 		/* if setting time, set it */
+-		if ((opt & OPT_SET) && stime(&ts.tv_sec) < 0) {
++		if ((opt & OPT_SET) && clock_settime(CLOCK_REALTIME, &ts) < 0) {
+ 			bb_simple_perror_msg("can't set date");
+ 		}
+ 	}
+diff --git a/libbb/missing_syscalls.c b/libbb/missing_syscalls.c
+index 87cf59b3d..dc40d9155 100644
+--- a/libbb/missing_syscalls.c
++++ b/libbb/missing_syscalls.c
+@@ -15,14 +15,6 @@ pid_t getsid(pid_t pid)
+ 	return syscall(__NR_getsid, pid);
+ }
+ 
+-int stime(const time_t *t)
+-{
+-	struct timeval tv;
+-	tv.tv_sec = *t;
+-	tv.tv_usec = 0;
+-	return settimeofday(&tv, NULL);
+-}
+-
+ int sethostname(const char *name, size_t len)
+ {
+ 	return syscall(__NR_sethostname, name, len);
+diff --git a/util-linux/rdate.c b/util-linux/rdate.c
+index 41aade5ea..bb1dc519a 100644
+--- a/util-linux/rdate.c
++++ b/util-linux/rdate.c
+@@ -95,9 +95,13 @@ int rdate_main(int argc UNUSED_PARAM, char **argv)
+ 	if (!(flags & 2)) { /* no -p (-s may be present) */
+ 		if (time(NULL) == remote_time)
+ 			bb_simple_error_msg("current time matches remote time");
+-		else
+-			if (stime(&remote_time) < 0)
++		else {
++			struct timespec ts;
++			ts.tv_sec = remote_time;
++			ts.tv_nsec = 0;
++			if (clock_settime(CLOCK_REALTIME, &ts) < 0)
+ 				bb_simple_perror_msg_and_die("can't set time of day");
++		}
+ 	}
+ 
+ 	if (flags != 1) /* not lone -s */
+-- 
+2.18.2
+
