トップ «前の日記(2007年01月07日) 最新 次の日記(2007年01月10日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2007年01月08日

debian etch sh3/sh4

checking "rpcgen -C" build of db_server.h... no
checking "rpcgen" build of db_server.h... no
configure: error: Unable to build RPC support: rpcgen failed.
make: *** [build] Error 1
コケた。なんだろ? rpcgen -C db_server.h に失敗する?試してみる。
# cd obj
# rpcgen -C db_server.h
cannot find any C preprocessor (cpp)
rpcgen: C preprocessor failed with exit code 1
cppが見つからない?んなわけないなぁ。/usr/bin/cpp は存在するし。strace してみる。
# strace rpcgen -C db_server.h
execve("/usr/bin/rpcgen", ["rpcgen", "-C", "db_server.h"], [/* 17 vars */]) = 0
uname({sys="Linux", node="landy3", ...}) = 0
brk(0)                                  = 0x424000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2956f000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=26377, ...}) = 0
old_mmap(NULL, 26377, PROT_READ, MAP_PRIVATE, 3, 0) = 0x29570000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0*\0\1\0\0\0`g\1\000"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1319944, ...}) = 0
old_mmap(NULL, 1389664, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x29580000
mprotect(0x296b7000, 115808, PROT_NONE) = 0
old_mmap(0x296c7000, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x137000) = 0x296c7000
old_mmap(0x296d1000, 9312, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x296d1000
mprotect(0x7bfff000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC|PROT_GROWSDOWN) = 0
close(3)                                = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x296d4000
mprotect(0x296c7000, 36864, PROT_READ)  = 0
mprotect(0x422000, 4096, PROT_READ)     = 0
mprotect(0x2957e000, 4096, PROT_READ)   = 0
munmap(0x29570000, 26377)               = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
stat64("db_server.h", {st_mode=S_IFREG|0644, st_size=296, ...}) = 0
brk(0)                                  = 0x424000
brk(0x445000)                           = 0x445000
pipe([3, 4])                            = 3
clone(cannot find any C preprocessor (cpp)
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0) = 5813
--- SIGCHLD (Child exited) @ 0 (0) ---
子プロセスで行わせているか。仕方ない、glibcのソースを見るか。
#define SVR4_CPP "/usr/ccs/lib/cpp"
#define SUNOS_CPP "/lib/cpp"
static const char *CPP = SUNOS_CPP;
略
/* make sure that a CPP exists */
static void
find_cpp (void)
{
  struct stat buf;
 
  if (stat (CPP, &buf) < 0)
    {                           /* /lib/cpp or explicit cpp does not exist */
      if (cppDefined)
        {
          fprintf (stderr, _ ("cannot find C preprocessor: %s \n"), CPP);
          crash ();
        }
      else
        {                       /* try the other one */
          CPP = SVR4_CPP;
          if (stat (CPP, &buf) < 0)
            {                   /* can't find any cpp */
              fputs (_ ("cannot find any C preprocessor (cpp)\n"), stdout);
              crash ();
            }
        }
    }
}
/lib/cpp ってか。ダイレクトにハードコーディングかよ。調べてみたら /lib/cpp が無かった。symlinkを貼って解決。
check your /lib/cpp

debian sh3/sh4 etch

aptをビルド
# cd apt-0.6.46.4
# dpkg-buildpackages -us -us
略
make[2]: Entering directory `/root/build/apt/apt-0.6.46.4/methods'
Compiling file.cc to ../build/obj/methods/file.o
Building program ../build/bin/methods/file
/usr/bin/ld: ../build/bin/methods/file: hidden symbol `__udivsi3_i4' in 
/usr/lib/gcc/sh4-linux-gnu/4.1.2/libgcc.a(_udivsi3_i4.o) is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
distcc[15769] ERROR: compile (null) on localhost failed
あっちゃ。また出た。libgccの演算ルーチンの周りって複雑怪奇だな。確かgcc-3.4の頃は修正パッチがあったと思うのだけど。。。gcc-4.1またビルドしなおしな悪寒(24時間コース)

__udivsi3_i4

まずは先輩諸兄のポインタ
http://www.hemamu.com/hemamu/diary/?date=20060219
http://gcc.gnu.org/ml/gcc-patches/2003-08/msg01255.html
DanとKazKojimaさんのやりとりを読んでみると、やっぱしlibgccのexportを作り直して再コンパイル(libgcc.aだけでよいか?)と思われる。それはまた後日時間のあるときにして今はaptを強引ビルドしてみる。 上記のログではデータが少なすぎるのでうるさくしてビルドする。
# cd build
# NOISY=yes make
略
make[2]: Entering directory `/root/build/apt/apt-0.6.46.4/methods'
echo Building program /root/build/apt/apt-0.6.46.4/build/bin/methods/file
Building program /root/build/apt/apt-0.6.46.4/build/bin/methods/file
distcc sh4-linux-gnu-g++  -L/root/build/apt/apt-0.6.46.4/build/bin  -o /root/build/apt/apt-0.6.46.4/build/bin/methods/file /root/build/apt/apt-0.6.46.4/build/obj/methods/file.o -lapt-pkg
/usr/bin/ld: /root/build/apt/apt-0.6.46.4/build/bin/methods/file: hidden symbol `__udivsi3_i4' in /usr/lib/gcc/sh4-linux-gnu/4.1.2/libgcc.a(_udivsi3_i4.o) is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
distcc[26591] ERROR: compile (null) on localhost failed
make[2]: *** [/root/build/apt/apt-0.6.46.4/build/bin/methods/file] Error 1
make[2]: Leaving directory `/root/build/apt/apt-0.6.46.4/methods'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/root/build/apt/apt-0.6.46.4'
make: *** [all] Error 2

__udivsi3_i4

gcc-4.1のソースを見てみると
$ cat src/gcc/config/sh/libgcc-excl.ver
# Exclude various symbols which should not be visible in libgcc.so for SH.
%exclude {
  __ashlsi3
  __ashrsi3
  __lshrsi3
  __mulsi3 # this is an SH1-only symbol.
  __udivsi3
}
シンボルが見えないように、わざわざ __udivsi3 をexcludeしてる。何でだろう?理由があるはずなんだけど分からない。これが原因だろうか。う〜ん。