x86_64でハマった件

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