diff mbox series

[v4] package/busybox: patch for glibc-2.31 and musl-1.2.0 compatibility

Message ID 20200315115910.31365-1-unixmania@gmail.com
State Superseded, archived
Headers show
Series [v4] package/busybox: patch for glibc-2.31 and musl-1.2.0 compatibility | expand

Commit Message

Carlos Santos March 15, 2020, 11:59 a.m. UTC
From: Evgeniy Didin <Evgeniy.Didin@synopsys.com>

Current release of busybox 1_31_1 is failing to build with glibc-2.31
due to removal of stime() from glibc. It also fails to build with musl
1.2.0 due to the direct use of __NR_clock_gettime.

This commit adds six patches: one is a prerequisite for the subsequent
patches, three to fix 64-bit time_t issues, one to fix the direct use of
__NR_clock_gettime, which is not safe, and one that removes
stime() function calls.

Fixes:
  http://autobuild.buildroot.net/results/f45f91aea6deee6699eabdfa618ac44873b8da51/

Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
Signed-off-by: Carlos Santos <unixmania@gmail.com>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Cc: arc-buildroot@synopsys.com
---
Supersedes: https://patchwork.ozlabs.org/patch/1249916/
---
Changes v4:
- Rabase on the master branch
- Add SOB lines to patches
---
 ...-overhead-of-single-parameter-bb_err.patch | 7637 +++++++++++++++++
 ...-Use-64-prefix-syscall-if-we-have-to.patch |   59 +
 ...-Use-64-prefix-syscall-if-we-have-to.patch |   48 +
 ...-Use-64-prefix-syscall-if-we-have-to.patch |   48 +
 ...rappers-around-clock_gettime-closes-.patch |  132 +
 .../0008-Remove-stime-function-calls.patch    |   95 +
 6 files changed, 8019 insertions(+)
 create mode 100644 package/busybox/0003-libbb-reduce-the-overhead-of-single-parameter-bb_err.patch
 create mode 100644 package/busybox/0004-date-Use-64-prefix-syscall-if-we-have-to.patch
 create mode 100644 package/busybox/0005-time-Use-64-prefix-syscall-if-we-have-to.patch
 create mode 100644 package/busybox/0006-runsv-Use-64-prefix-syscall-if-we-have-to.patch
 create mode 100644 package/busybox/0007-Remove-syscall-wrappers-around-clock_gettime-closes-.patch
 create mode 100644 package/busybox/0008-Remove-stime-function-calls.patch

Comments

Romain Naour March 21, 2020, 6:12 p.m. UTC | #1
Hello Carlos,

Le 15/03/2020 à 12:59, unixmania@gmail.com a écrit :
> From: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
> 
> Current release of busybox 1_31_1 is failing to build with glibc-2.31
> due to removal of stime() from glibc. It also fails to build with musl
> 1.2.0 due to the direct use of __NR_clock_gettime.

This patch is far too big IMHO ;-)
It would be great if you can split this patch an create a patch series.

> 
> This commit adds six patches: one is a prerequisite for the subsequent
> patches, three to fix 64-bit time_t issues, one to fix the direct use of
> __NR_clock_gettime, which is not safe, and one that removes
> stime() function calls.

Instead of backporting patch 0003, try to rebase patch 0008 over busybox 1.31.1.

But for the remaining patches, maybe you can squash then since the patch 0007
remove the syscall wrappers around clock_gettime that was modified by patch
0004, 0005, 0006.

It would be great to ask upstream for a new release 1.32 or backport those
patches to 1.31.x.

Another solution would be using the current busybox master as a last resort.

Best regards,
Romain

> 
> Fixes:
>   http://autobuild.buildroot.net/results/f45f91aea6deee6699eabdfa618ac44873b8da51/
> 
> Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
> Signed-off-by: Carlos Santos <unixmania@gmail.com>
> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> Cc: arc-buildroot@synopsys.com
> ---
> Supersedes: https://patchwork.ozlabs.org/patch/1249916/
> ---
> Changes v4:
> - Rabase on the master branch
> - Add SOB lines to patches
> ---
>  ...-overhead-of-single-parameter-bb_err.patch | 7637 +++++++++++++++++
>  ...-Use-64-prefix-syscall-if-we-have-to.patch |   59 +
>  ...-Use-64-prefix-syscall-if-we-have-to.patch |   48 +
>  ...-Use-64-prefix-syscall-if-we-have-to.patch |   48 +
>  ...rappers-around-clock_gettime-closes-.patch |  132 +
>  .../0008-Remove-stime-function-calls.patch    |   95 +
>  6 files changed, 8019 insertions(+)
>  create mode 100644 package/busybox/0003-libbb-reduce-the-overhead-of-single-parameter-bb_err.patch
>  create mode 100644 package/busybox/0004-date-Use-64-prefix-syscall-if-we-have-to.patch
>  create mode 100644 package/busybox/0005-time-Use-64-prefix-syscall-if-we-have-to.patch
>  create mode 100644 package/busybox/0006-runsv-Use-64-prefix-syscall-if-we-have-to.patch
>  create mode 100644 package/busybox/0007-Remove-syscall-wrappers-around-clock_gettime-closes-.patch
>  create mode 100644 package/busybox/0008-Remove-stime-function-calls.patch
> 
> 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..c54d7b1b2f
> --- /dev/null
> +++ b/package/busybox/0003-libbb-reduce-the-overhead-of-single-parameter-bb_err.patch
> @@ -0,0 +1,7637 @@
> +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>
> +Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
> +Signed-off-by: Carlos Santos <unixmania@gmail.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..c71307ec66
> --- /dev/null
> +++ b/package/busybox/0004-date-Use-64-prefix-syscall-if-we-have-to.patch
> @@ -0,0 +1,59 @@
> +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>
> +Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
> +Signed-off-by: Carlos Santos <unixmania@gmail.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..3172372dcd
> --- /dev/null
> +++ b/package/busybox/0005-time-Use-64-prefix-syscall-if-we-have-to.patch
> @@ -0,0 +1,48 @@
> +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>
> +Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
> +Signed-off-by: Carlos Santos <unixmania@gmail.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..f396db9269
> --- /dev/null
> +++ b/package/busybox/0006-runsv-Use-64-prefix-syscall-if-we-have-to.patch
> @@ -0,0 +1,48 @@
> +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>
> +Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
> +Signed-off-by: Carlos Santos <unixmania@gmail.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..8d496a671c
> --- /dev/null
> +++ b/package/busybox/0007-Remove-syscall-wrappers-around-clock_gettime-closes-.patch
> @@ -0,0 +1,132 @@
> +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>
> +Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
> +Signed-off-by: Carlos Santos <unixmania@gmail.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..49d5abb383
> --- /dev/null
> +++ b/package/busybox/0008-Remove-stime-function-calls.patch
> @@ -0,0 +1,95 @@
> +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>
> +Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
> +Signed-off-by: Carlos Santos <unixmania@gmail.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
> +
>
Romain Naour March 21, 2020, 8:36 p.m. UTC | #2
Hello Carlos,

Le 15/03/2020 à 12:59, unixmania@gmail.com a écrit :
> From: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
> 
> Current release of busybox 1_31_1 is failing to build with glibc-2.31
> due to removal of stime() from glibc. It also fails to build with musl
> 1.2.0 due to the direct use of __NR_clock_gettime.

This patch is far too big IMHO ;-)
It would be great if you can split this patch an create a patch series.

> 
> This commit adds six patches: one is a prerequisite for the subsequent
> patches, three to fix 64-bit time_t issues, one to fix the direct use of
> __NR_clock_gettime, which is not safe, and one that removes
> stime() function calls.

Instead of backporting patch 0003, try to rebase patch 0008 over busybox 1.31.1.

But for the remaining patches, maybe you can squash then since the patch 0007
remove the syscall wrappers around clock_gettime that was modified by patch
0004, 0005, 0006.

It would be great to ask upstream for a new release 1.32 or backport those
patches to 1.31.x.

Another solution would be using the current busybox master as a last resort.

Best regards,
Romain

> 
> Fixes:
>   http://autobuild.buildroot.net/results/f45f91aea6deee6699eabdfa618ac44873b8da51/
> 
> Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
> Signed-off-by: Carlos Santos <unixmania@gmail.com>
> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> Cc: arc-buildroot@synopsys.com
> ---
> Supersedes: https://patchwork.ozlabs.org/patch/1249916/
> ---
> Changes v4:
> - Rabase on the master branch
> - Add SOB lines to patches
> ---
>  ...-overhead-of-single-parameter-bb_err.patch | 7637 +++++++++++++++++
>  ...-Use-64-prefix-syscall-if-we-have-to.patch |   59 +
>  ...-Use-64-prefix-syscall-if-we-have-to.patch |   48 +
>  ...-Use-64-prefix-syscall-if-we-have-to.patch |   48 +
>  ...rappers-around-clock_gettime-closes-.patch |  132 +
>  .../0008-Remove-stime-function-calls.patch    |   95 +
>  6 files changed, 8019 insertions(+)
>  create mode 100644 package/busybox/0003-libbb-reduce-the-overhead-of-single-parameter-bb_err.patch
>  create mode 100644 package/busybox/0004-date-Use-64-prefix-syscall-if-we-have-to.patch
>  create mode 100644 package/busybox/0005-time-Use-64-prefix-syscall-if-we-have-to.patch
>  create mode 100644 package/busybox/0006-runsv-Use-64-prefix-syscall-if-we-have-to.patch
>  create mode 100644 package/busybox/0007-Remove-syscall-wrappers-around-clock_gettime-closes-.patch
>  create mode 100644 package/busybox/0008-Remove-stime-function-calls.patch
>
Yann E. MORIN March 21, 2020, 9:34 p.m. UTC | #3
Romain, Carlos, All,

On 2020-03-21 21:36 +0100, Romain Naour spake thusly:
> Le 15/03/2020 à 12:59, unixmania@gmail.com a écrit :
> > From: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
> > Current release of busybox 1_31_1 is failing to build with glibc-2.31
> > due to removal of stime() from glibc. It also fails to build with musl
> > 1.2.0 due to the direct use of __NR_clock_gettime.
> This patch is far too big IMHO ;-)

Well, if that's just backports of upstream patches, that's OKish.

> It would be great if you can split this patch an create a patch series.

There I agree. Of course, if upstream fixed both in a single commit, use
a single patch to backport that commit. Since this can be a bit
ambiguous, here's what I mean:

  [1/2] package/busybox: fix builg with glib 2.31
        Note one of the backpoted patch also fix a musl-related failure
        in addition ot fixing a glibc issue.

  [2/2] package/busybox: fix builg with musl 1.2.0

> > This commit adds six patches: one is a prerequisite for the subsequent
> > patches, three to fix 64-bit time_t issues, one to fix the direct use of
> > __NR_clock_gettime, which is not safe, and one that removes
> > stime() function calls.
> 
> Instead of backporting patch 0003, try to rebase patch 0008 over busybox 1.31.1.
> 
> But for the remaining patches, maybe you can squash then since the patch 0007
> remove the syscall wrappers around clock_gettime that was modified by patch
> 0004, 0005, 0006.

There I highly disagree: we want to backport uptream patches as-is, even
if they borked their fixes and needed three or four patches on top of
each others: when we eventually update, we'll want to be able to quickly
asses whther we can drop patches.

> It would be great to ask upstream for a new release 1.32 or backport those
> patches to 1.31.x.

That'd be ideal, or even if they could backport to 1.31.x.

> Another solution would be using the current busybox master as a last resort.

As a *last* *resort*, I'd be OK to take a bump to a sha1, yes, but that
would need to demonstrate that upstream is not ready by far to make a
release, and that backporting individual commits is too tedious...

Regards,
Yann E. MORIN.

> Best regards,
> Romain
> 
> > 
> > Fixes:
> >   http://autobuild.buildroot.net/results/f45f91aea6deee6699eabdfa618ac44873b8da51/
> > 
> > Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
> > Signed-off-by: Carlos Santos <unixmania@gmail.com>
> > Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> > Cc: arc-buildroot@synopsys.com
> > ---
> > Supersedes: https://patchwork.ozlabs.org/patch/1249916/
> > ---
> > Changes v4:
> > - Rabase on the master branch
> > - Add SOB lines to patches
> > ---
> >  ...-overhead-of-single-parameter-bb_err.patch | 7637 +++++++++++++++++
> >  ...-Use-64-prefix-syscall-if-we-have-to.patch |   59 +
> >  ...-Use-64-prefix-syscall-if-we-have-to.patch |   48 +
> >  ...-Use-64-prefix-syscall-if-we-have-to.patch |   48 +
> >  ...rappers-around-clock_gettime-closes-.patch |  132 +
> >  .../0008-Remove-stime-function-calls.patch    |   95 +
> >  6 files changed, 8019 insertions(+)
> >  create mode 100644 package/busybox/0003-libbb-reduce-the-overhead-of-single-parameter-bb_err.patch
> >  create mode 100644 package/busybox/0004-date-Use-64-prefix-syscall-if-we-have-to.patch
> >  create mode 100644 package/busybox/0005-time-Use-64-prefix-syscall-if-we-have-to.patch
> >  create mode 100644 package/busybox/0006-runsv-Use-64-prefix-syscall-if-we-have-to.patch
> >  create mode 100644 package/busybox/0007-Remove-syscall-wrappers-around-clock_gettime-closes-.patch
> >  create mode 100644 package/busybox/0008-Remove-stime-function-calls.patch
> > 
> _______________________________________________
> buildroot mailing list
> buildroot@busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
Romain Naour March 21, 2020, 9:54 p.m. UTC | #4
Hello Yann, Carlos, All,

Le 21/03/2020 à 22:34, Yann E. MORIN a écrit :
> Romain, Carlos, All,
> 
> On 2020-03-21 21:36 +0100, Romain Naour spake thusly:
>> Le 15/03/2020 à 12:59, unixmania@gmail.com a écrit :
>>> From: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
>>> Current release of busybox 1_31_1 is failing to build with glibc-2.31
>>> due to removal of stime() from glibc. It also fails to build with musl
>>> 1.2.0 due to the direct use of __NR_clock_gettime.
>> This patch is far too big IMHO ;-)
> 
> Well, if that's just backports of upstream patches, that's OKish.
> 
>> It would be great if you can split this patch an create a patch series.
> 
> There I agree. Of course, if upstream fixed both in a single commit, use
> a single patch to backport that commit. Since this can be a bit
> ambiguous, here's what I mean:
> 
>   [1/2] package/busybox: fix builg with glib 2.31
>         Note one of the backpoted patch also fix a musl-related failure
>         in addition ot fixing a glibc issue.
> 
>   [2/2] package/busybox: fix builg with musl 1.2.0

Yes, this is exactly what I suggested :)

> 
>>> This commit adds six patches: one is a prerequisite for the subsequent
>>> patches, three to fix 64-bit time_t issues, one to fix the direct use of
>>> __NR_clock_gettime, which is not safe, and one that removes
>>> stime() function calls.
>>
>> Instead of backporting patch 0003, try to rebase patch 0008 over busybox 1.31.1.
>>
>> But for the remaining patches, maybe you can squash then since the patch 0007
>> remove the syscall wrappers around clock_gettime that was modified by patch
>> 0004, 0005, 0006.
> 
> There I highly disagree: we want to backport uptream patches as-is, even
> if they borked their fixes and needed three or four patches on top of
> each others: when we eventually update, we'll want to be able to quickly
> asses whther we can drop patches.

Ok, my bad.

> 
>> It would be great to ask upstream for a new release 1.32 or backport those
>> patches to 1.31.x.
> 
> That'd be ideal, or even if they could backport to 1.31.x.
> 
>> Another solution would be using the current busybox master as a last resort.
> 
> As a *last* *resort*, I'd be OK to take a bump to a sha1, yes, but that
> would need to demonstrate that upstream is not ready by far to make a
> release, and that backporting individual commits is too tedious...

The last busybox release was made the 10/06/2019 and busybox usually release two
version per year. So we can guess that the 1.32.0 will be released in the near
future.

Best regards,
Romain

> 
> Regards,
> Yann E. MORIN.
> 
>> Best regards,
>> Romain
>>
>>>
>>> Fixes:
>>>   http://autobuild.buildroot.net/results/f45f91aea6deee6699eabdfa618ac44873b8da51/
>>>
>>> Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
>>> Signed-off-by: Carlos Santos <unixmania@gmail.com>
>>> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
>>> Cc: arc-buildroot@synopsys.com
>>> ---
>>> Supersedes: https://patchwork.ozlabs.org/patch/1249916/
>>> ---
>>> Changes v4:
>>> - Rabase on the master branch
>>> - Add SOB lines to patches
>>> ---
>>>  ...-overhead-of-single-parameter-bb_err.patch | 7637 +++++++++++++++++
>>>  ...-Use-64-prefix-syscall-if-we-have-to.patch |   59 +
>>>  ...-Use-64-prefix-syscall-if-we-have-to.patch |   48 +
>>>  ...-Use-64-prefix-syscall-if-we-have-to.patch |   48 +
>>>  ...rappers-around-clock_gettime-closes-.patch |  132 +
>>>  .../0008-Remove-stime-function-calls.patch    |   95 +
>>>  6 files changed, 8019 insertions(+)
>>>  create mode 100644 package/busybox/0003-libbb-reduce-the-overhead-of-single-parameter-bb_err.patch
>>>  create mode 100644 package/busybox/0004-date-Use-64-prefix-syscall-if-we-have-to.patch
>>>  create mode 100644 package/busybox/0005-time-Use-64-prefix-syscall-if-we-have-to.patch
>>>  create mode 100644 package/busybox/0006-runsv-Use-64-prefix-syscall-if-we-have-to.patch
>>>  create mode 100644 package/busybox/0007-Remove-syscall-wrappers-around-clock_gettime-closes-.patch
>>>  create mode 100644 package/busybox/0008-Remove-stime-function-calls.patch
>>>
>> _______________________________________________
>> buildroot mailing list
>> buildroot@busybox.net
>> http://lists.busybox.net/mailman/listinfo/buildroot
>
diff mbox series

Patch

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..c54d7b1b2f
--- /dev/null
+++ b/package/busybox/0003-libbb-reduce-the-overhead-of-single-parameter-bb_err.patch
@@ -0,0 +1,7637 @@ 
+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>
+Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
+Signed-off-by: Carlos Santos <unixmania@gmail.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..c71307ec66
--- /dev/null
+++ b/package/busybox/0004-date-Use-64-prefix-syscall-if-we-have-to.patch
@@ -0,0 +1,59 @@ 
+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>
+Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
+Signed-off-by: Carlos Santos <unixmania@gmail.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..3172372dcd
--- /dev/null
+++ b/package/busybox/0005-time-Use-64-prefix-syscall-if-we-have-to.patch
@@ -0,0 +1,48 @@ 
+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>
+Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
+Signed-off-by: Carlos Santos <unixmania@gmail.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..f396db9269
--- /dev/null
+++ b/package/busybox/0006-runsv-Use-64-prefix-syscall-if-we-have-to.patch
@@ -0,0 +1,48 @@ 
+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>
+Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
+Signed-off-by: Carlos Santos <unixmania@gmail.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..8d496a671c
--- /dev/null
+++ b/package/busybox/0007-Remove-syscall-wrappers-around-clock_gettime-closes-.patch
@@ -0,0 +1,132 @@ 
+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>
+Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
+Signed-off-by: Carlos Santos <unixmania@gmail.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..49d5abb383
--- /dev/null
+++ b/package/busybox/0008-Remove-stime-function-calls.patch
@@ -0,0 +1,95 @@ 
+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>
+Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
+Signed-off-by: Carlos Santos <unixmania@gmail.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
+