이것저것 시도해보다가 다음과 같이 mecab-java-0.996의 Makefile에서 gcc 최적화 옵션을 -O나 -O1으로 낮추면 정상 동작하는 것을 확인하였습니다. 뭔가 매우 찝찝하지만 일단은 여기까지 입니다. -_-a
테스트 된 환경은 다음과 같습니다.
CentOS 6.3관련하여 더 좋은 해결 방법을 아시는 분은 알려주시면 감사 하겠습니다.
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.1) (rhel-1.45.1.11.1.el6-i386)
OpenJDK Server VM (build 20.0-b12, mixed mode)
TARGET=MeCab
JAVAC=javac
JAVA=java
JAR=jar
CXX=c++
INCLUDE=/usr/lib/jvm/java-6-
PACKAGE=org/chasen/mecab
LIBS=`mecab-config --libs`
INC=`mecab-config --cflags` -I$(INCLUDE) -I$(INCLUDE)/linux
all:
$(CXX) -O3 -c -fpic $(TARGET)_wrap.cxx $(INC)
$(CXX) -O1 -c -fpic $(TARGET)_wrap.cxx $(INC)
$(CXX) -shared $(TARGET)_wrap.o -o lib$(TARGET).so $(LIBS)
$(JAVAC) $(PACKAGE)/*.java
$(JAVAC) test.java
$(JAR) cfv $(TARGET).jar $(PACKAGE)/*.class
test:
env LD_LIBRARY_PATH=. $(JAVA) test
clean:
rm -fr *.jar *.o *.so *.class $(PACKAGE)/*.class
cleanall:
rm -fr $(TARGET).java *.cxx
|
아 댓글 쓴게 날라갔네요 ㅜㅜ;
답글삭제같은 문제로 고생하다가 아래와 같은 정보를 얻어서 공유드립니다.
"최적화를 통해 사용되는 레지스터는 강제형전환에 의한 C 언어표준규격상 지원하는 않는 방법으로
메모리에 접근하기 때문에 명확히 알고 사용하지 않는 경우에는 구성에 따라 이런 문제를 발생시킬 수도 있습니다."
"최적화를 수행하는 옵션에서는 이러한 문제를 확인하기 위해서 strict-aliasing=2 옵션을 함께 사용합니다."
Mecab.so 파일을 만들 때 gcc 옵션에 strict-aliasing=2 옵션을 추가해서, 에러가 나면 Mecab.so 파일을 만들지 않도록 Make 파일을 수정하는게 좋을 것 같습니다.
저의 경우 최적화 옵션(O3)를 사용했을 때
- 로컬에서는 문제가 없었으나,
- 서버환경에서는 말씀하신 형태소 분석이 실패하고, memcopy 에러가 발생했습니다.
로컬 환경과 서버 환경의 가장 큰 차이는 libc.so(?) 의 버전 차이로, 서버 환경의 버전이 더 낮았습니다.
좌표: http://forum.falinux.com/zbxe/?amp;amp;mid=lecture_tip&mid=lecture_tip&page=7&listStyle=webzine&document_srl=560566&sort_index=readed_count&order_type=desc
유용한 정보 감사합니다. :)
삭제