Avoid stack overflows (happened invoking emacs scripts)
diff --git a/Makefile b/Makefile
index daf0f3f..8af4002 100644
--- a/Makefile
+++ b/Makefile
@@ -11,7 +11,9 @@
OSSRCS=src/win/inject.c src/win/dbg.c
LDOBJS=$(ROOT64)\x86_64-w64-mingw32\lib\CRT_noglob.o
INSTALLDIR=$(APPDATA)\local\bin
-
+LDFLAGS=-s
+LDFLAGS32=-s
+LDFLAGS64=-s
else
PLAT=unix
@@ -19,7 +21,6 @@
LDFLAGS=-g
OS=$(shell uname -s)
-LS=$(shell which ls)
ifeq ($(OS),Linux)
LDLIBS=-ldl -lrt
@@ -29,7 +30,9 @@
endif
-CFLAGS+= -g -std=c99 -Wall -O2 -fomit-frame-pointer -fno-stack-protector -MMD
+LS=$(shell which ls)
+
+CFLAGS+= -std=c99 -Wall -O2 -fomit-frame-pointer -fno-stack-protector -MMD
SRCS=src/fsatrace.c src/$(PLAT)/proc.c src/$(PLAT)/shm.c $(OSSRCS)
diff --git a/src/fsatrace.c b/src/fsatrace.c
index 82bccc8..a558428 100644
--- a/src/fsatrace.c
+++ b/src/fsatrace.c
@@ -95,6 +95,20 @@
uniq(d, tot, end + 1, last, lastsz);
}
+static void
+workaround(const char *oenv, size_t buf_size)
+{
+#ifdef _WIN32
+ // Workaround, bash distributed with ghc 8.6.5 seems to discard
+ // most environment variables, pass environment variables as the
+ // first few PATH components.
+ char env[65536];
+ snprintf(env, sizeof(env), "PATH=%s;%ld;%s", oenv, (long)buf_size,
+ getenv("PATH"));
+ putenv(env);
+#endif
+}
+
int
main(int argc, char *const argv[])
{
@@ -141,17 +155,7 @@
snprintf(
envbufsize, sizeof(envbufsize), ENVBUFSIZE "=%ld", (long)buf_size);
putenv(envbufsize);
-#ifdef _WIN32
- {
- // Workaround, bash distributed with ghc 8.6.5 seems to discard
- // most environment variables, pass environment variables as the
- // first few PATH components.
- char env[65536];
- snprintf(env, sizeof(env), "PATH=%s;%ld;%s", out,
- (long)buf_size, getenv("PATH"));
- putenv(env);
- }
-#endif
+ workaround(out, buf_size);
fflush(stdout);
opts = (const unsigned char *)argv[1];
bopts = shm.buf + 4;
diff --git a/src/win/fsatracedll.c b/src/win/fsatracedll.c
index c911608..bab324e 100644
--- a/src/win/fsatracedll.c
+++ b/src/win/fsatracedll.c
@@ -18,6 +18,34 @@
return ret;
}
+static void
+dlldeps()
+{
+ // DLLs that were loaded before we got hooked, so mark
+ // them as a read dependency
+ DWORD cb = 0;
+ wchar_t winBuf[PATH_MAX];
+ char utfBuf[PATH_MAX];
+ HANDLE hProcess = GetCurrentProcess();
+ HMODULE modules[8000]; // Pick a huge value to make sure
+ // we pick up everything
+ if (EnumProcessModules(hProcess, modules, sizeof(modules), &cb)) {
+ // If the buffer we passed was too small, just
+ // ignore it
+ if (sizeof(modules) >= cb) {
+ for (int i = 0; i < cb / sizeof(HMODULE); i++) {
+ DWORD res = GetModuleFileNameExW(
+ hProcess, modules[i], winBuf, PATH_MAX);
+ if (res != 0)
+ emitOp('r',
+ utf8PathFromWide(
+ utfBuf, winBuf, res),
+ 0);
+ }
+ }
+ }
+}
+
INT APIENTRY
DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
{
@@ -26,36 +54,7 @@
switch (Reason) {
case DLL_PROCESS_ATTACH:
emitInit();
- {
- // DLLs that were loaded before we got hooked, so mark
- // them as a read dependency
- DWORD cb = 0;
- wchar_t winBuf[PATH_MAX];
- char utfBuf[PATH_MAX];
- HANDLE hProcess = GetCurrentProcess();
- HMODULE modules[8000]; // Pick a huge value to make sure
- // we pick up everything
- if (EnumProcessModules(
- hProcess, modules, sizeof(modules), &cb)) {
- // If the buffer we passed was too small, just
- // ignore it
- if (sizeof(modules) >= cb) {
- for (int i = 0;
- i < cb / sizeof(HMODULE); i++) {
- DWORD res =
- GetModuleFileNameExW(
- hProcess, modules[i],
- winBuf, PATH_MAX);
- if (res != 0)
- emitOp('r',
- utf8PathFromWide(
- utfBuf, winBuf,
- res),
- 0);
- }
- }
- }
- }
+ dlldeps();
patchInit();
hooksInit(resolve);
break;
diff --git a/win.mk b/win.mk
index d3dce2e..9e6cf14 100644
--- a/win.mk
+++ b/win.mk
@@ -15,10 +15,10 @@
$(CC32) -c $(CPPFLAGS32) $(CFLAGS) -march=i686 $< -o $@
fsatracehelper.exe: $(HELPER_OBJ)
- $(CC32) $< -o $@
+ $(CC32) $(LDFLAGS) $< -o $@
fsatest32.exe: src/fsatest32.o
- $(CC32) $< -o $@
+ $(CC32) $(LDFLAGS) $< -o $@
fsatrace64.dll: $(OBJS64)
$(CC) -shared $(LDFLAGS64) $^ -o $@ $(LDLIBS)