summaryrefslogtreecommitdiff
path: root/src/haproxy.c
diff options
context:
space:
mode:
authorWilly Tarreau <w@1wt.eu>2021-12-28 15:43:11 +0100
committerWilly Tarreau <w@1wt.eu>2021-12-28 17:07:13 +0100
commit654726db5ab1160ad5dc8d356e2965e69c163dcf (patch)
treea68ec182b086952801cc50ad33acca0303b899ae /src/haproxy.c
parent6ab7b21a1108c0f187d09196dfc20d40f654e6c9 (diff)
downloadhaproxy-20211228-debug-dump-libs-2.tar.gz
MINOR: debug: add support for -dL to dump library names at boot20211228-debug-dump-libs-2
This is a second help to dump loaded library names late at boot, once external code has already been initialized. The purpose is to provide a format that makes it easy to pass to "tar" to produce an archive containing the executable and the list of dependencies. For example if haproxy is started as "haproxy -f foo.cfg", a config check only will suffice to quit before starting, "-q" will be used to disable undesired output messages, and -dL will be use to dump libraries. This will result in such a command to trivially produce a tarball of loaded libraries: ./haproxy -q -c -dL -f foo.cfg | tar -T - -hzcf archive.tgz
Diffstat (limited to 'src/haproxy.c')
-rw-r--r--src/haproxy.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/haproxy.c b/src/haproxy.c
index dda03a994..ba91d34fe 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -597,6 +597,9 @@ static void usage(char *name)
#if defined(SO_REUSEPORT)
" -dR disables SO_REUSEPORT usage\n"
#endif
+#if defined(HA_HAVE_DUMP_LIBS)
+ " -dL dumps loaded object files after config checks\n"
+#endif
" -dr ignores server address resolution failures\n"
" -dV disables SSL verify on servers side\n"
" -dW fails if any warning is emitted\n"
@@ -1632,6 +1635,10 @@ static void init(int argc, char **argv)
mem_poison_byte = flag[2] ? strtol(flag + 2, NULL, 0) : 'P';
else if (*flag == 'd' && flag[1] == 'r')
global.tune.options |= GTUNE_RESOLVE_DONTFAIL;
+#if defined(HA_HAVE_DUMP_LIBS)
+ else if (*flag == 'd' && flag[1] == 'L')
+ arg_mode |= MODE_DUMP_LIBS;
+#endif
else if (*flag == 'd')
arg_mode |= MODE_DEBUG;
else if (*flag == 'c' && flag[1] == 'c') {
@@ -1773,7 +1780,7 @@ static void init(int argc, char **argv)
global.mode |= (arg_mode & (MODE_DAEMON | MODE_MWORKER | MODE_FOREGROUND | MODE_VERBOSE
| MODE_QUIET | MODE_CHECK | MODE_DEBUG | MODE_ZERO_WARNING
- | MODE_DIAG | MODE_CHECK_CONDITION));
+ | MODE_DIAG | MODE_CHECK_CONDITION | MODE_DUMP_LIBS));
if (getenv("HAPROXY_MWORKER_WAIT_ONLY")) {
unsetenv("HAPROXY_MWORKER_WAIT_ONLY");
@@ -2056,6 +2063,15 @@ static void init(int argc, char **argv)
exit(1);
}
+#if defined(HA_HAVE_DUMP_LIBS)
+ if (global.mode & MODE_DUMP_LIBS) {
+ qfprintf(stdout, "List of loaded object files:\n");
+ chunk_reset(&trash);
+ if (dump_libs(&trash, 0))
+ printf("%s", trash.area);
+ }
+#endif
+
if (global.mode & MODE_CHECK) {
struct peers *pr;
struct proxy *px;