Qtopia애플리케이션이 segmentation fault 에러를 냅니다.

embedded의 이미지

제가 지난주부터, 회사에서 qflashplayer라는 것을, mips용으로 컴파일해보려고 하는데, 안되서, 눈치보이고, 좀더가면, 욕먹을것 같아서, 죽겠네요.
qflashplayer

* Version : 0.1.0-1
* Section : qpe/applications
* Architecture : arm
* Maintainer : ichitokumei
* MD5Sum : 6876ddcc43e3d61ef9548e480ddc6af4
* Size : 89530
* Filename: qflashplayer_0.1.0-1_arm.ipk
* Description : A swf file player based on flash-0.4.10 by Olivier Debon.

라는 것은, 원래 위와 같은 것으로, qtopia를 이용해서, arm용으로 ichitokumei란 사람이 만든것인가보던데, 소스를 찾아보라고 해서, 간신히 인터넷에서 찾았습니다.
근데, 위에 보이는것처럼, qflashplayer는 Olivier Debon이란 사람이 만든 flash-0.4.10버전의 flashplayer에 기반을 두고 있습니다. GPL Flash ™ library 라고 하는것으로, 홈페이지는 http://www.swift-tools.net/Flash/ 입니다.
그래서, 먼저, flash-0.4.10.tgz부터 압축풀고, make하여 호스트(x11)용으로 컴파일해보았습니다.
그랬더니, 에러가 많이 뜨고 하여, gcc컴파일러도 버전을 3.4대인가로 yum으로 다시받아서, 낮추고 해서, 소스및 Makefile들도 다소 수정하고 해서 make를 해보았는데, 여전히 에러가 많이 났습니다.
다음이 제가 flash-0.4.10을 고친 내용입니다.
* 추가: "#include " in /Lib/shape.h 또는 shape.cc (sqrt()함수 인식 못함 in shape.cc)
* 바꿈: CC: gcc'-> 'CC: g++' in /Player/Makefile("undefined reference .." errors 출력함. / gcc-> g++로 바꾸라는 글을 읽음.)
* 바꿈: malloc() -> (char *)malloc() in /Player/main.c .
* 추가: #include for strlen() in /Player/main.c .
* 삭제: "int shape_size, ...." ( /Lib/flash.cc 에도 정의되어 있음/ 중복정의 에러 출력)
* 추가: fe.key=(FlashKey)0; (int 를 FlashKey로 바꿀수 업다는 에러때문..)

flash -0.4.10디렉토리밑에, 여러 서브디렉토리가 있는데, Jpeg, Zlib, Lib, Player, Plugin 디렉토리까지는 에러없이 컴파일되도록 고쳤는데, Kflash 디렉토리에서 에러가 많이 났지만, 구글에서 검색하다 보니, Kflash에서 나는 에러는 아래와 같은 글처럼, 상관없다고 하더군요.
Note: If you don't have QT/KDE installed, the build will fail somewhere in the "Kflash" subdirectory. Ignore these errors if you don't need the KDE screensaver.
그래서, 원래 qflashplayer는 flashplayer의 컴파일된, /Lib/libflash.a과 /Jpeg/libjpeg.a만을 이용하는 것같아서도, 그만 두고, flashplayer의 Player디렉토리에 갔더니, swfplayer라는 실행프로그램도 만들어졌습니다.
그래서, flashplayer의 Test라는 서브디렉토리에 들어있는 *.swf파일을 명령인자로 주어 실행시켜보니, X11환경에서 잘 실행되더군요.
그래서, 이번엔 qflashplayer를 컴파일해보려고 보니, 그안에 README인가에, 일어로 대충보니, flashplayer 디렉토리밑에 설치하라고 되있어서, 그렇게 qflashplayer디렉토리가 위치하도록 압축파일을 풀고, qtopia코드를 이용하는듯, main.cpp에 #include 이 있어서, Qtopia를 깔기전엔 x11용으로는, 컴파일이 어려울것 같아서, 원래 목적대로, mips용으로 컴파일할려고, 사수분이 주신 파일을, 해당 문서대로 압축해제하고, 환경변수설정해주어서, mips용 gcc및 mips용 qtopia를 설치하였습니다.
둘다 SDK라고 이름들어간 거라서 그런지, 압축만풀으니까 되더군요.
hello world! qt예제파일을 mips용으로 컴파일해서, 타겟(PMP입니다..)으로 다운해서(USB연결로 그냥 파일 옮기는 겁니다.) 실행시켜보니, 잘실행되더군요.
그래서, 이번엔, 먼저, flashplayer를 mips용으로 컴파일할려고 보니, 소스가 한두개가 아니고, 서브디렉토리로 나눠져 있어, 어떻게 해야 하나 하다가, 헬로월드에서는, 소스 몇개있는 디렉토리에서, qmake 정도만 해주면 환경변수가 맞춰져있어서인지, 알아서, mipsel-linux-gcc 등으로 써지는, Makefile이 만들어져서, 그대로, make해주면 되었는데, flashplayer는, 각서브디렉토리마다 들어있는 이미 Makefile이 만들어져 있는데, 그대로 make를 하면 호스트용 x86버전의 gcc등이 실행되기 때문에, Makefile들을 일일이 수정해주어야 하나 하고 생각했습니다.
flashplayer최상위 디렉토리에서, 헬로월드예제하듯, progen과 qmake해봐도, 그 Makefile로는 make해보면, *.a파일도 생성이 안되었기 떄문입니다.
그래서, 각각의 서브디렉토리에 있는 Makefile을 일일이 gcc는 mipsel-linux-gcc등으로 바꾸어주었는데(flashplayer 최상위 디렉토리의 Makefile은 실질적으로 컴파일하는 부분이 전혀 없어서..) 그래도, make할때보면, gcc, g++, cc등이 불러져서 실행되는 것이어서, 난감해하다가, mips용 gcc sdk디렉토리를 보니, 이름은 gcc, g++등인데, 실제로는 mips용인파일들이 있는 디렉토리가 있길래, 그 디렉토리를 PATH에 호스트용 gc등이 있는 /usr/bin 디렉토리보다 앞에 위치하게 PATH환경변수에 추가해주었습니다.
그러니까, 이름은 gcc등이지만, 실제로는 mips용인 컴파일러가 실행되는것 같더군요.
그래서, flashplayer에 대해 make를 실행해보니, 이전에 호스트용으로 할때와 달리, Jpeg, Zlib, Lib까지만, 컴파일이 에러없이 되고, 나머지 디렉토리에서는 모두 에러가 나서, 결과적으로 *.a파일은 만들어지지만, Player디렉토리에 swfplayer실행파일은 만들어지지 않더군요.
그 Player디렉토리에 들어있는 main.cpp파일에 보면, #include 등과 같이 X11디렉토리밑에 들어있는 파일을 참조하는데, 그걸 해결못해줘서 그런듯 합니다.
어차피, qfashplayer가 필요한것은, *.a 파일이므로, 상관없다 생각하고, 필요한 두개의 *.a파일이 만들어져서, 이번에 qflashplayer를 컴파일할려고, 그 디렉토리에 들어있는 Makefile을 수정한후, arm-linux-gcc등과 같은 부분을 그냥 gcc등으로, 컴파일해보니까, -lqpe 를 못찾는다는 에러가 나서, Makefile에 -L$(QPEDIR)/lib 부분을 첨가해주니까, warning몇개 외에는 에러가 안나고, 실행파일도 만들어지더군요.
구체적으로 qflashplayer의 Makefile을 바꾼 부분은 다음과 같습니다.
* 추가: '-L$(QPEDIR)/lib' at 'LIBS =' line at Makefile("not found -lqpe" error때문)
* 추가: '-I$(QPEDIR)/include at 'INCPATH ='라인.(#include 를 인식못함.)

그 실행파일을 file 명령으로 file qflashplayer식으로 쳐보니까,
qflashplayer: ELF 32-bit LSB executable, MIPS, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), for GNU/Linux 2.4.0, not stripped
와 같이, mips용이라고 잘 표시되더군요.
그런데, 문제는 그 파일을 타겟PMP로 다운받아서, 그 임베디드 리눅스 qtopia에서 터미널상에서 실행시켜보면 segmentation fault에러가 나는 것입니다.(그 밖엔 아무것도 안뜹니다.)
그래서, 지금 해결방안으로, qflashplayer를 우선 호스트컴퓨터에서 qvfb를 통해 에뮬레이트할 수 있게 컴파일부터 먼저 해볼려고, Qtopia-free-2.1.1 version, Qt/embedded-2.3.10 ver., Qt-x11-2.3.2 ver를 Fedora core 6 linux host computer에 설치했습니다.
그래서, qvfb 와 qpe 를 실행시키고, 호스트용 gcc 3.4대용과 QT/임베디드로 컴파일해서 기반 flashplayer의 swfplayer는 컴파일역시 했는데, 역시 qflashplayer를 컴파일했습니다.
그런데, 마찬가지로 세그먼트에러가 납니다.
다음은 gdb로 확인한 결과입니다.
(gdb) r -qws
Starting program: /root/work/p2Apps/FlashPlayer/flash-0.4.10/qflashplayer/qflashplayer -qws

Program received signal SIGSEGV, Segmentation fault.
0x0804dca4 in FlashExec (flashHandle=0xb7f16b38, flag=2, fe=0xbf89d8a0,
wakeDate=0xbf89dcf8) at flash.cc:152
152 if (fh->main->program->nbFrames == 0) return 0; // Still not ready
(gdb) p fh->main->program->nbFrames
Cannot access memory at address 0x13
(gdb) bt
#0 0x0804dca4 in FlashExec (flashHandle=0xb7f16b38, flag=2, fe=0xbf89d8a0,
wakeDate=0xbf89dcf8) at flash.cc:152
#1 0x0804c2cf in FlashWidget::FlashExecQt (this=0xbf89dc40, fh=0xb7f16b38,
flag=2, event=0xbf89da30, wakeDate=0xbf89dcf8) at flashwidget.cpp:48
#2 0x0804d14a in FlashWidget::showEvent (this=0xbf89dc40, event=0xbf89da30)
at flashwidget.cpp:337
#3 0x0082fafa in QWidget::event () from /root/dev/qt-2.3.10/lib/libqte.so.2
#4 0x007c2351 in QApplication::notify ()
from /root/dev/qt-2.3.10/lib/libqte.so.2
#5 0x00831884 in QWidget::show () from /root/dev/qt-2.3.10/lib/libqte.so.2
#6 0x0078d0c2 in QWidget::showMaximized ()
from /root/dev/qt-2.3.10/lib/libqte.so.2
#7 0x0043368f in QPEApplicationData::show_mx ()
from /root/dev/qtopia-free-2.1.1/image/opt/Qtopia/lib/libqpe.so.1
#8 0x0042f091 in QPEApplication::showMainDocumentWidget ()
from /root/dev/qtopia-free-2.1.1/image/opt/Qtopia/lib/libqpe.so.1
#9 0x0804d5e4 in main (argc=1, argv=0xbf89de74) at main.cpp:37
(gdb) info frame
Stack level 0, frame at 0xbf89d880:
eip = 0x804dca4 in FlashExec (flash.cc:152); saved eip 0x804c2cf
called by frame at 0xbf89d8c0
source language c++.
Arglist at 0xbf89d878, args: flashHandle=0xb7f16b38, flag=2, fe=0xbf89d8a0,
wakeDate=0xbf89dcf8
Locals at 0xbf89d878, Previous frame's sp is 0xbf89d880
Saved registers:
ebx at 0xbf89d874, ebp at 0xbf89d878, eip at 0xbf89d87c
(gdb)

이런 경우, 디버깅을 어떻게 해야 할지, 또는 뭐가 문제여서 이런 문제가 생기는지 아시면 좀 알려주세요.
위의 세그먼트에러가 나는 구체적인 부분은 다음과 같습니다.
../Lib/flash.cc에서 입니다.
long FlashExec(FlashHandle flashHandle, long flag, FlashEvent *fe, struct timeval *wakeDate)
{
FlashMovie *fh;
long wakeUp = 0;
fh = (FlashMovie *)flashHandle;
if (fh->main == NULL) return 0; // Not ready
if (fh->main->program == NULL) return 0; // Not ready
여기입니다.=> if (fh->main->program->nbFrames == 0) return 0; // Still not ready
if (fh->gd == 0) return 0;
.....

제 생각에는 flashHandle이 FlashMovie class의
인스턴스를 제대로 갖지 못했기 떄문인듯 합니다.
하지만, 어떻게 해결해야 할지는 모르겠습니다.
아시는 분은 답변주시면 진심으로 감사하겠습니다.
http://swift-tools.net/Flash/flash-0.4.10.tgz
http://www.geocities.co.jp/SiliconValley-Oakland/4550/qflashplayer.tar.gz
이 그 자료입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.