トップ 最新 追記
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)

2011年07月12日

debian lenny sh4

libgtk2.0-devのconfigure中に libpangoが見つからないというエラーが出た。が、よくよく configure.log を見ていると問題はcairoにあることがわかった
/usr/lib/gcc/sh4-linux-gnu/4.3.2/../../../libcairo.so: undefined reference to `__sync_val_compare_and_swap_4'
pathが冗長だが/usr/lib/libcairo.so.2.17.5に問題がある
readelf -s /usr/lib/libcairo.so.2.17.5 | grep __sync
    32: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND __sync_val_compare_and_sw
シンボルの表示が途切れてしまっているが、該当の関数がundefinedになっている。
__sync_val_compare_and_swap_4 は gccライブラリの組み込み関数で、これは共有ライブラリから共有ライブラリとして呼び出してはいけない。共有ライブラリ(libcairo.so.2.17.5)をビルドするときには -lgcc を付加してスタティックにリンクする必要がある。cairoのビルド(リンク)時に -lgcc が付くよう修正してビルド、楽勝っ・・・と思ったがエラーがなおらない。おや
$ nm src/.libs/libcairo.so | grep __sync
0006607c t __sync_compare_and_swap_1
00066094 t __sync_compare_and_swap_2
000660ac t __sync_compare_and_swap_4
000660c4 t __sync_fetch_and_add_1
000660d8 t __sync_fetch_and_add_2
000660ec t __sync_fetch_and_add_4
0006613c t __sync_fetch_and_and_1
00066150 t __sync_fetch_and_and_2
00066164 t __sync_fetch_and_and_4
000661fc t __sync_fetch_and_nand_1
00066214 t __sync_fetch_and_nand_2
0006622c t __sync_fetch_and_nand_4
00066100 t __sync_fetch_and_or_1
00066114 t __sync_fetch_and_or_2
00066128 t __sync_fetch_and_or_4
000661b4 t __sync_fetch_and_sub_1
000661cc t __sync_fetch_and_sub_2
000661e4 t __sync_fetch_and_sub_4
00066178 t __sync_fetch_and_xor_1
0006618c t __sync_fetch_and_xor_2
000661a0 t __sync_fetch_and_xor_4
00066040 t __sync_lock_test_and_set_1
00066054 t __sync_lock_test_and_set_2
00066068 t __sync_lock_test_and_set_4
         U __sync_val_compare_and_swap_4
他のgcc関数は定義済みになっているが、ひとつだけ U のままである。cairoのバグを当たってみる。

ということで、ソースパッケージ直下の configure を修正する事で対処した

$ vi configure
...
/* end confdefs.h.  */
int atomic_add(int i) { return __sync_fetch_and_add (&i, 1); }
int atomic_int_cmpxchg(int i, int j, int k) { return__sync_val_compare_and_swap(&i, j, k); } ※この行を追記する。
int
main ()