We talked about this is chat but I thought I should probably put everything in an issue for full documentation of things attempted/results, and to let others voice opinions. I have been trying to get my docker upgraded and part of that includes getting FTL in my primary docker tag, which is alpine traditionally. Now I could drop alpine support but the size differences is pretty big between alpine and debian and I'm sure I wouldn't be the only one disappointed.
The first approach I decided on trying was just use the musl-gcc wrapper application, which fills in the necessary paths and such for GCC compiling for musl. I didn't get very far in fixing the first compilation error, where it cannot seem to find the qsort's 4th arg type of __compar_fn_t
musl-gcc -c -o obj/main.o main.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -pie -fPIE -g3 -rdynamic -fno-omit-frame-pointer
musl-gcc -c -o obj/structs.o structs.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -pie -fPIE -g3 -rdynamic -fno-omit-frame-pointer
musl-gcc -c -o obj/log.o log.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -pie -fPIE -g3 -rdynamic -fno-omit-frame-pointer
musl-gcc -c -o obj/daemon.o daemon.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -pie -fPIE -g3 -rdynamic -fno-omit-frame-pointer
musl-gcc -c -o obj/parser.o parser.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -pie -fPIE -g3 -rdynamic -fno-omit-frame-pointer
musl-gcc -c -o obj/signals.o signals.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -pie -fPIE -g3 -rdynamic -fno-omit-frame-pointer
musl-gcc -c -o obj/socket.o socket.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -pie -fPIE -g3 -rdynamic -fno-omit-frame-pointer
musl-gcc -c -o obj/request.o request.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -pie -fPIE -g3 -rdynamic -fno-omit-frame-pointer
request.c: In function โgetTopDomainsโ:
request.c:293:55: error: โ__compar_fn_tโ undeclared (first use in this function)
qsort(temparray, counters.domains, sizeof(int[2]), (__compar_fn_t)cmpdesc);
^
request.c:293:55: note: each undeclared identifier is reported only once for each function it appears in
request.c:293:69: error: expected โ)โ before โcmpdescโ
qsort(temparray, counters.domains, sizeof(int[2]), (__compar_fn_t)cmpdesc);
^
request.c:295:69: error: expected โ)โ before โcmpascโ
qsort(temparray, counters.domains, sizeof(int[2]), (__compar_fn_t)cmpasc);
^
request.c: In function โgetTopClientsโ:
request.c:400:54: error: โ__compar_fn_tโ undeclared (first use in this function)
qsort(temparray, counters.clients, sizeof(int[2]), (__compar_fn_t)cmpasc);
^
request.c:400:68: error: expected โ)โ before โcmpascโ
qsort(temparray, counters.clients, sizeof(int[2]), (__compar_fn_t)cmpasc);
^
request.c: In function โgetForwardDestinationsโ:
request.c:458:58: error: โ__compar_fn_tโ undeclared (first use in this function)
qsort(temparray, counters.forwarded+1, sizeof(int[2]), (__compar_fn_t)cmpdesc);
^
request.c:458:72: error: expected โ)โ before โcmpdescโ
qsort(temparray, counters.forwarded+1, sizeof(int[2]), (__compar_fn_t)cmpdesc);
^
Makefile:44: recipe for target 'obj/request.o' failed
make: *** [obj/request.o] Error 1
I messed with that for a while but C is not my forte and I couldn't seem to google my way past that type error so I next tried a glibc static binary...it seems to actually start up inside of my alpine docker but it does have these 2 warnings, which I'm not sure if that'll cause problems down the road or not...this is more an FYI.
root@d5f38ecee56c:/usr/src/myapp# make clean ; make
rm -f obj/*.o pihole-FTL
gcc -c -o obj/main.o main.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/structs.o structs.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/log.o log.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/daemon.o daemon.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/parser.o parser.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/signals.o signals.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/socket.o socket.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/request.o request.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/grep.o grep.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/setupVars.o setupVars.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/args.o args.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/flush.o flush.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/threads.o threads.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/gc.o gc.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -c -o obj/config.o config.c -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer
gcc -v -I. -Wall -Wextra -Wno-unused-parameter -D_FILE_OFFSET_BITS=64 -fstack-protector -D_FORTIFY_SOURCE=2 -O3 -Wl,-z,relro,-z,now -static -fPIC -g3 -rdynamic -fno-omit-frame-pointer -o pihole-FTL obj/main.o obj/structs.o obj/log.o obj/daemon.o obj/parser.o obj/signals.o obj/socket.o obj/request.o obj/grep.o obj/setupVars.o obj/args.o obj/flush.o obj/threads.o obj/gc.o obj/config.o -pthread
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.9.4/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: /usr/src/gcc/configure --disable-multilib --enable-languages=c,c++,fortran,go
Thread model: posix
gcc version 4.9.4 (GCC)
COMPILER_PATH=/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.9.4/:/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.9.4/:/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/:/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.9.4/:/usr/local/lib/gcc/x86_64-unknown-linux-gnu/
LIBRARY_PATH=/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.9.4/:/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.9.4/../../../../lib64/:/lib/x86_64-linux-gnu/:/lib/../lib64/:/usr/lib/x86_64-linux-gnu/:/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.9.4/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-I' '.' '-Wall' '-Wextra' '-Wno-unused-parameter' '-D' '_FILE_OFFSET_BITS=64' '-fstack-protector' '-D' '_FORTIFY_SOURCE=2' '-O3' '-static' '-fPIC' '-g3' '-rdynamic' '-fno-omit-frame-pointer' '-o' 'pihole-FTL' '-pthread' '-mtune=generic' '-march=x86-64'
/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.9.4/collect2 -plugin /usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.9.4/liblto_plugin.so -plugin-opt=/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.9.4/lto-wrapper -plugin-opt=-fresolution=/tmp/ccqMEy2b.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-lc -m elf_x86_64 -static -o pihole-FTL /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.9.4/crtbeginT.o -L/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.9.4 -L/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.9.4/../../../../lib64 -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.9.4/../../.. -z relro -z now obj/main.o obj/structs.o obj/log.o obj/daemon.o obj/parser.o obj/signals.o obj/socket.o obj/request.o obj/grep.o obj/setupVars.o obj/args.o obj/flush.o obj/threads.o obj/gc.o obj/config.o --start-group -lgcc -lgcc_eh -lpthread -lc --end-group /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.9.4/crtend.o /usr/lib/x86_64-linux-gnu/crtn.o
obj/daemon.o: In function `getUserName':
/usr/src/myapp/daemon.c:225: warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
obj/parser.o: In function `resolveHostname':
/usr/src/myapp/parser.c:618: warning: Using 'gethostbyaddr' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
bash-4.3# cat /etc/issue
Welcome to Alpine Linux 3.5
Kernel \r on an \m (\l)
bash-4.3# telnet 127.0.0.1 4711
>top-clients
0 2 172.17.0.5
1 2 ::1
---EOM---
>forward-dest
0 10 8.8.4.4
1 2 8.8.8.8
---EOM---
I'll keep you posted as I go down the static glibc road more since I'm in over my head with musl libc compilation which sounds like it may require some rewriting.