aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@chromium.org>2021-04-16 13:00:01 -0400
committerMike Frysinger <vapier@gentoo.org>2021-04-16 13:00:01 -0400
commit1f3572f01249e929feb26309fed5c2ce7d932a86 (patch)
tree15052a829adc83ef44780290bf6b5ce1d3aba847
parentlddtree: add --cwd option (diff)
downloadpax-utils-1f3572f0.tar.gz
pax-utils-1f3572f0.tar.bz2
pax-utils-1f3572f0.zip
build: support debugging/testing object internals
Add a hack so we can build individual objects as standalone programs. This way we can more easily poke internal static funcs to aid in the overall debugging/development process. Bug: https://bugs.gentoo.org/739014 Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r--.gitignore3
-rw-r--r--Makefile20
-rw-r--r--paxldso.c18
3 files changed, 36 insertions, 5 deletions
diff --git a/.gitignore b/.gitignore
index 6e0a530..33f051f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,6 +36,9 @@ stamp-h1
/dumpelf
/lddtree
+/paxelf
+/paxldso
+/paxmacho
/pspax
/scanelf
/scanmacho
diff --git a/Makefile b/Makefile
index c906311..8a54faf 100644
--- a/Makefile
+++ b/Makefile
@@ -67,19 +67,26 @@ endif
override CPPFLAGS += -DVCSID='"$(VCSID)"'
####################################################################
-ELF_TARGETS = scanelf dumpelf $(shell echo | $(CC) -dM -E - | grep -q __svr4__ || echo pspax)
+ELF_TARGETS = scanelf dumpelf $(shell $(CC) -dM -E - </dev/null | grep -q __svr4__ || echo pspax)
ELF_OBJS = paxelf.o paxldso.o
MACH_TARGETS = scanmacho
MACH_OBJS = paxmacho.o
COMMON_OBJS = paxinc.o security.o xfuncs.o
TARGETS = $(ELF_TARGETS) $(MACH_TARGETS)
+TARGETS_OBJS = $(TARGETS:%=%.o)
SCRIPTS_SH = lddtree symtree
SCRIPTS_PY = lddtree
-OBJS = $(ELF_OBJS) $(MACH_OBJS) $(COMMON_OBJS) $(TARGETS:%=%.o)
+_OBJS = $(ELF_OBJS) $(MACH_OBJS) $(COMMON_OBJS)
+OBJS = $(_OBJS) $(TARGETS_OBJS)
+# Not all objects support this hack. Otherwise we'd use $(_OBJS:%.o=%)
+OBJS_TARGETS = paxldso
MPAGES = $(TARGETS:%=man/%.1)
SOURCES = $(OBJS:%.o=%.c)
-all: $(OBJS) $(TARGETS)
+all: $(TARGETS)
+ @:
+
+all-dev: all $(OBJS_TARGETS)
@:
DEBUG_FLAGS = \
@@ -88,7 +95,7 @@ DEBUG_FLAGS = \
-fsanitize=leak \
-fsanitize=undefined
debug: clean
- $(MAKE) CFLAGS="$(CFLAGS) -g3 -ggdb $(call check_compiler_many,$(DEBUG_FLAGS))" all
+ $(MAKE) CFLAGS="$(CFLAGS) -g3 -ggdb $(call check_compiler_many,$(DEBUG_FLAGS))" all-dev
@-chpax -permsx $(ELF_TARGETS)
@-paxctl -permsx $(ELF_TARGETS)
@@ -120,6 +127,9 @@ $(ELF_TARGETS): %: $(ELF_OBJS) $(COMMON_OBJS) %.o
$(MACH_TARGETS): %: $(MACH_OBJS) $(COMMON_OBJS) %.o
$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ $(LIBS) $(LIBS-$@)
+$(OBJS_TARGETS): %: $(_OBJS) %.c
+ $(CC) $(CFLAGS) $(CPPFLAGS) -DMAIN $(LDFLAGS) $(filter-out $@.o,$^) -o $@ $(LIBS) $(LIBS-$@)
+
%.so: %.c
$(CC) -shared -fPIC -o $@ $<
@@ -127,7 +137,7 @@ depend:
$(CC) $(CFLAGS) -MM $(SOURCES) > .depend
clean:
- -rm -f $(OBJS) $(TARGETS)
+ -rm -f $(OBJS) $(TARGETS) $(OBJS_TARGETS)
distclean: clean
-rm -f *~ core *.o
diff --git a/paxldso.c b/paxldso.c
index 2d8ddea..d89210d 100644
--- a/paxldso.c
+++ b/paxldso.c
@@ -371,3 +371,21 @@ void paxldso_cleanup(void)
#endif
const char * ldcache_path = "/etc/ld.so.cache";
+
+#ifdef MAIN
+
+const char argv0[] = "paxldso";
+
+int main(int argc, char *argv[])
+{
+ elfobj *elf = readelf(argv[0]);
+ for (int i = 1; i < argc; ++i) {
+ const char *search = argv[i];
+ const char *lib = ldso_cache_lookup_lib(elf, search);
+ printf("%s -> %s\n", search, lib);
+ }
+ unreadelf(elf);
+ paxldso_cleanup();
+}
+
+#endif