为iMX.53交叉编译的DirectFB-启动时崩溃



试图获得一个可在嵌入式系统中使用的工作directfb,该系统基于运行Linux 2.6.35.3(由Freescale提供)的i.MX53处理器(是ARM Cortex-A8内核)。

我在i686debian主机系统上安装了一个交叉编译器。交叉编译器来自embedian.org档案,是gcc-4.3-arm-linux-gnueabi包(arm-linux-gnueabi-gcc (Debian 4.3.2-1.1) 4.3.2)。这是由glibc 2.7提供的。这与我的目标系统上的版本glibc 2.11不同,尽管我的阅读表明它们应该兼容。

在对系统映像上已经存在的库进行了大量实验之后,我成功地编译了directfb1.6.2。由于我没有已经安装的库的可用pkg配置信息,这一事实使情况变得复杂,但我最终说服它使用以下configure命令行进行编译:

TOP=`realpath ../..`
PKG_CONFIG_PATH=${TOP}/ext/libpng-1.5.13/ 
LIBPNG_CFLAGS=-I${TOP}/include 
LIBPNG_LDFLAGS="-L${TOP}/libs -lpng15 -lz" 
FREETYPE_CFLAGS=-I${TOP}/include 
FREETYPE_LIBS="-L${TOP}/libs -lfreetype" 
LIBS="-lgcc_s -lgcc -ldl -lstdc++ -lz" 
CFLAGS="-march=armv7-a" 
CXXFLAGS="-march=armv7-a" 
./configure CC=arm-linux-gnueabi-gcc CPPFLAGS=-I${TOP}/include LDFLAGS=-L${TOP}/lib 
--build=i686-linux --host=arm-linux-gnueabi 
--enable-static --disable-shared 
--disable-freetype --enable-fbdev --disable-x11 
--with-gfxdrivers=none --with-inputdrivers=none

这成功地构建了,我可以编译并链接一个基于简单教程应用程序的示例应用程序,网址为http://directfb.org/docs/DirectFB_Tutorials/simple.html——不幸的是,当在目标系统上运行时,应用程序会因SIGSEGV而崩溃。directfb中包含的一些工具也是如此,例如dfbinfo。

以下是我的测试应用程序崩溃的堆栈跟踪(当使用命令行arg"--dfb:fbdev=/dev/fb0"运行时):

#0  direct_map_lookup (map=0x0, key=0xdfd70) at map.c:298
#1  0x000b2d9c in direct_config_set (name=0xdfd70 "fbdev",
value=0xdfd76 "/dev/fb0") at conf.c:542
#2  0x0009edc0 in dfb_config_set (name=0xdfd70 "fbdev",
value=0xdfd76 "/dev/fb0") at conf.c:2024
#3  0x000a2dcc in parse_args (args=0x7ea80d53 "fbdev=/dev/fb0") at conf.c:297
#4  0x000a305c in dfb_config_init (argc=0x7ea80968, argv=0x7ea80964)
at conf.c:2159
#5  0x0000cd58 in Display::Display ()
#6  0x0000ba94 in main ()

作为参考,崩溃前在应用程序中执行的唯一与directfb相关的代码是直接从教程代码中复制的:

Display::Display(int argc, char ** argv)
{
DFBSurfaceDescription dsc;       
DFBCHECK (DirectFBInit (&argc, &argv));  
// ... crash occurs during execution of the line above
}

这是从我的主函数直接调用的,传递原始未修改的argc和argv。

我在目标系统上安装了/usr/local/lib中的directfb库和/usr/local/bin中的二进制文件,并创建了/usr/local/share/directfb-1.6.2(包含cursor.dat和decker.dgiff)以及文档中建议的/etc/fb.mode。

关于我做错了什么,有什么建议吗?

从git.directfb.org读取conf.c和maps.c的源代码并检查堆栈。。。

#0  direct_map_lookup (map=0x0, key=0xdfd70) at map.c:298
#1  0x000b2d9c in direct_config_set (name=0xdfd70 "fbdev", value=0xdfd76 "/dev/fb0") at conf.c:542

映射为null。它应该在map.c:295上断言,但看起来它被禁用了,但在298上崩溃了

hash = map->hash( map, key, map->ctx );

上一次呼叫符合c:542,

ConfigOption *option = direct_map_lookup( config_options, name );

即config_options为CCD_ 2。在该文件中搜索,它被分配给文件的唯一位置是__D_conf_init()。

我对directfb一无所知,但看起来你需要直接或间接地调用__D_conf_init

相关内容

  • 没有找到相关文章

最新更新