기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
안녕하세요.
QT라이브러리를 4.4.3버전으로 쓰다가 항상 하루이틀 arm보드에 구동 시키면 알 수 없는 포인터 주소 문제로 어제 4.8로 업버전 시켜보았습니다.
그런데 이 버전은 특이하게도 항상 같은 곳에서 Alignment Trap 메세지가 출력 되었습니다.
디버거로 해당 코드를 확인 해 보니 qblendfunctions.cpp의 qt_blend_argb24_on_rgb16 함수내부의
for (int y=0; y<h; ++y) {
const uchar *src = srcPixels + y * sbpl;
const uchar *srcEnd = src + srcOffset;
while (src < srcEnd) {
#if defined(QT_ARCH_ARMV5) || defined(QT_ARCH_POWERPC) || defined(QT_ARCH_SH) || defined(QT_ARCH_AVR32) || (defined(QT_ARCH_WINDOWSCE) && !defined(_X86_)) || (defined(QT_ARCH_SPARC) && defined(Q_CC_GNU)) || (defined(QT_ARCH_INTEGRITY) && !defined(_X86_))
// non-16-bit aligned memory access is not possible on PowerPC,
// ARM <v6 (QT_ARCH_ARMV5) & SH & AVR32 & SPARC w/GCC
quint16 spix = (quint16(src[2])<<8) + src[1];
#else
quint16 spix = *(quint16 *) (src + 1);
#endif
uchar alpha = alphaFunc.alpha(*src);
위와 같은 코드에서 #else - #endif 사이의 코드가 실행 되면서 발생하였습니다.
QT의 소스코드를 바꾸면 라이센스 위반으로 알고있는데 코드는 손 안대고 #if - #else 사이의 코드를 진입하게 하거나 argb24형식의 pixmap을 생성 못하게 하고 싶은데 어떻게 하면 좋을지 아시는 분 계시면 답변 부탁드립니다.
영어만 하면 QT 포럼에도 질문 할텐데 orz
당장은 "echo 0 > /proc/cpu/alignment" 해버리면 무시 되지만 왠지 그냥 두기에는 찜찜합니다.
./configure -debug -xplatform qws/linux-armv6-g++ -embedded arm -little-endian -no-largefile -no-webkit -no-script -no-accessibility -no-qt3support -qt-zlib -qt-libpng -qt-libmng -qt-libjpeg -no-nis -no-cups -qt-freetype -depths 16 -qt-mouse-tslib -qt-gfx-linuxfb -qt-gfx-qvfb -qt-gfx-vnc -prefix /nfs/RootFS/usr/local -confirm-license -opensource
추가로 빌드 할 때의 옵션입니다. 혹시나 참고 될까 해서 넣었습니다.
이상입니다.
덧.
total used free shared buffers cached
Mem: 123 89 34 0 0 79
-/+ buffers/cache: 9 113
Swap: 0 0 0
free -m 하면 위와 같이 나오는데 buffer/cache의 값이 이상한거 같습니다. 정상일까요?