試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

x86_64上ではwinegccが正常に動作しない?(前半)

(2009/2/15)この記事の問題はバージョン1.1.15のWineでは解決されている。

wime(1.8.0)のビルドメモとebuild」から扱っていたwimeについて、ATOKの試用期限を過ぎている関係で動作は確認できないものの、Mandriva向けパッケージだけでも作成しておこうと思い、ビルドしようとしたのだが
[任意]ファイル名: wime-1.8.3-build.patch

diff -ur wime-1.8.3.orig/Makefile wime-1.8.3/Makefile
--- wime-1.8.3.orig/Makefile
+++ wime-1.8.3/Makefile
@@ -9,7 +9,7 @@
 DOTDIR=$(HOME)/.wime
 RCFILE=hinshi
 
-override CFLAGS += -std=gnu99 -Wno-multichar -fgnu89-inline
+override CFLAGS += -std=gnu99 -Wno-multichar -fgnu89-inline -fPIC
 
 define callsubmake
 for d in $(SUBDIRS);do\
diff -ur wime-1.8.3.orig/dll/Makefile wime-1.8.3/dll/Makefile
--- wime-1.8.3.orig/dll/Makefile
+++ wime-1.8.3/dll/Makefile
@@ -3,8 +3,8 @@
 
 CC=winegcc
 SPEC=$(basename $(APP)).spec
-override CFLAGS+=-I../so
-override LDFLAGS+=
+override CFLAGS+=-m32 -I../so
+override LDFLAGS+=-m32
 
 vpath %.h ../so
 
@@ -19,6 +19,7 @@
 	rm -f $(APP) $(OBJS)
 
 install:
+	mkdir -p $(WINELIBDIR)
 	install $(APP) $(WINELIBDIR)
 
 uninstall:
diff -ur wime-1.8.3.orig/exe/Makefile wime-1.8.3/exe/Makefile
--- wime-1.8.3.orig/exe/Makefile
+++ wime-1.8.3/exe/Makefile
@@ -5,8 +5,8 @@
 LIBS=lib.o list.o
 VPATH=$(LIBDIR) ../so
 
-override CFLAGS+=-I../so -I$(LIBDIR) -mconsole -mno-cygwin
-override LDFLAGS+=-limm32 -mconsole -mno-cygwin
+override CFLAGS+=-m32 -I../so -I$(LIBDIR) -mconsole -mno-cygwin
+override LDFLAGS+=-m32 -limm32 -mconsole -mno-cygwin -Wl,-z,noexecstack
 
 APPSCRIPT=$(basename $(basename $(APP)))
 
diff -ur wime-1.8.3.orig/lib/Makefile wime-1.8.3/lib/Makefile
--- wime-1.8.3.orig/lib/Makefile
+++ wime-1.8.3/lib/Makefile
@@ -1,5 +1,7 @@
 OBJS= lib.o list.o
 
+override CFLAGS += -m32
+
 all:$(OBJS)
 
 install:
diff -ur wime-1.8.3.orig/so/Makefile wime-1.8.3/so/Makefile
--- wime-1.8.3.orig/so/Makefile
+++ wime-1.8.3/so/Makefile
@@ -4,7 +4,8 @@
 LIBS=lib.o
 VPATH=$(LIBDIR) ../exe
 
-override CFLAGS+=-I$(LIBDIR) -I../exe -I../so
+override CFLAGS+=-m32 -I$(LIBDIR) -I../exe -I../so
+override LDFLAGS+=-m32
 
 all:$(APP)
 
diff -ur wime-1.8.3.orig/tools/hinshi-list/Makefile wime-1.8.3/tools/hinshi-list/Makefile
--- wime-1.8.3.orig/tools/hinshi-list/Makefile
+++ wime-1.8.3/tools/hinshi-list/Makefile
@@ -2,8 +2,8 @@
 CC=winegcc
 OBJS= hinshi-list.o
 
-override CFLAGS+=-I../../so -mconsole -mno-cygwin
-override LDFLAGS+=-limm32
+override CFLAGS+=-m32 -I../../so -mconsole -mno-cygwin
+override LDFLAGS+=-m32 -limm32
 
 APPSCRIPT=$(basename $(basename $(APP)))
 

以前Gentooのときに使用した上記修正だけでは

$ tar jxf [wime-1.8.5.tar.bz2の場所]
$ cd wime-1.8.5/
$ patch -p1 < [wime-1.8.3-build.patchの場所]
patching file Makefile                       
patching file dll/Makefile
patching file exe/Makefile
patching file lib/Makefile
patching file so/Makefile
patching file tools/hinshi-list/Makefile
$ LC_MESSAGES=C make
for d in lib so dll exe tools;do make -C $d all || exit 1; done
make[1]: Entering directory `/tmp/work/wime-1.8.5/lib'
cc -g -Wall -std=gnu99 -Wno-multichar -fgnu89-inline -fPIC -m32   -c -o lib.o lib.c
cc -g -Wall -std=gnu99 -Wno-multichar -fgnu89-inline -fPIC -m32   -c -o list.o list.c
make[1]: Leaving directory `/tmp/work/wime-1.8.5/lib'
make[1]: Entering directory `/tmp/work/wime-1.8.5/so'
cc -g -Wall -std=gnu99 -Wno-multichar -fgnu89-inline -fPIC -m32 -I../lib -I../exe -I../so   -c -o libwime.o libwime.c
cc  -m32 -shared -Wl,-soname,libwime.so -o libwime.so libwime.o ../lib/lib.o
make[1]: Leaving directory `/tmp/work/wime-1.8.5/so'
make[1]: Entering directory `/tmp/work/wime-1.8.5/dll'
winegcc -g -Wall -std=gnu99 -Wno-multichar -fgnu89-inline -fPIC -m32 -I../so   -c -o libwime.o libwime.c
winegcc -shared libwime.dll.spec -mno-cygwin -L../so -lwime  -m32 -o libwime.dll.so libwime.o
ld: Relocatable linking with relocations from format elf32-i386 (libwime.o) to format elf64-x86-64 (libwime.CgHb7M.o) is not supported
winebuild: ld -r failed with status 256
winegcc: winebuild failed
make[1]: *** [libwime.dll.so] Error 2
make[1]: Leaving directory `/tmp/work/wime-1.8.5/dll'
make: *** [all] Error 1

となって失敗した。dllディレクトリで手動でwinegccコマンドを

  • LD="ld -m elf_i386"
  • GNUTARGET=elf32-i386
  • linux32コマンド
  • オプションに「-Xlinker "-m elf_i386"」や「-Xlinker -m -Xlinker elf_i386

など色々と変化させて試したが、効果はなかった。環境変数WINEBUILDは受け付けることが分かったが

WINEBUILD="winebuild [オプション...]" winegcc ...

の形式で実行すると

winegcc: winebuild [オプション...] failed

となってしまい、後ろにオプションが付けられない。-vでもダメ。winebuildへのラッパースクリプトを作成して

#! /bin/sh
winebuild --ld-cmd=[適当なコマンド] -v ${@}

これを環境変数WINEBUILDに指定すると

$ WINEBUILD=[ラッパースクリプトの場所] winegcc -shared libwime.dll.spec -mno-cygwin -L../so -lwime  -m32 -o libwime.dll.so libwime.o
as -o libwime.5XhPiL.o libwime.oilffz.s
ld -r -o libwime.y4nd22.o libwime.5XhPiL.o libwime.o /usr/lib/wine/libwinecrt0.a
ld: Relocatable linking with relocations from format elf32-i386 (libwime.o) to format elf64-x86-64 (libwime.y4nd22.o) is not supported
winebuild: ld -r failed with status 256
winegcc: [ラッパースクリプトの場所] failed

-vオプションを渡すことはできた(上の出力が詳細になっている)が--ld-cmdオプションだけは何故か見てくれない。

使用したバージョン:

  • Wine 1.1.10 (libwine-devel 1.1.10-1mdv2009.0)