unixbench-4.1.0をx86_64な環境で走らせるとexeclだけスコアがゼロになるなーと思ったら、src/execl.cのexecl(3)で(char *)NULLじゃなくて0でターミネートしてたの原因というオチ。
じゃっかんハマったのはi386な環境ではこれでちゃんと動く点。
あと、最適化オプションと32,64ビットオプションの組み合わせで挙動が変わる点。
とりえあず結果をポピペ。
$ ./test.sh Linux goa 2.6.24-19-generic #1 SMP Wed Aug 20 17:53:40 UTC 2008 x86_64 GNU/Linux -O2 -m64 OK -O2 -m64 -DZERO_JYA_DAMEDA_O Gyaaaaaaaaaaaa -O0 -m64 OK -O0 -m64 -DZERO_JYA_DAMEDA_O OK -O2 -m32 OK -O2 -m32 -DZERO_JYA_DAMEDA_O OK -O0 -m32 OK -O0 -m32 -DZERO_JYA_DAMEDA_O OK
/* test-execl.c */ #include <stdio.h> #include <unistd.h> int main(int argc, char ** argv) { execl("/bin/ls", "ls", "/one", "/two", "/san", "/yon", #ifdef ZERO_JYA_DAMEDA_O 0); #else (char *)NULL); #endif perror("nande koko ni kitan?"); return 0; }
#!/bin/bash uname -a; echo P=test-execl TEST_CFLAGS=( '-O2 -m64' '-O2 -m64 -DZERO_JYA_DAMEDA_O' '-O0 -m64' '-O0 -m64 -DZERO_JYA_DAMEDA_O' '-O2 -m32' '-O2 -m32 -DZERO_JYA_DAMEDA_O' '-O0 -m32' '-O0 -m32 -DZERO_JYA_DAMEDA_O' ) dounano() { ./$P 2>&1 | grep -q nande && echo 'Gyaaaaaaaaaaaa' || echo 'OK' } for cflags in "${TEST_CFLAGS[@]}"; do rm -f $P gcc $cflags $P.c -o $P printf "%-32s %s\n" "$cflags" $(dounano) done