最近用到了rt5350,该cpu提供的gcc版本和linux内核都很低。
在编译其他工具库时都没发现问题,结果在编译luasocket,lanes出现问题。
因为会用到dlopen,如果不主动链接pthread库,会crash。
具体请见https://sourceware.org/bugzilla/attachment.cgi?id=8223&action=edit
在使用类似xxxx.core时,发现如果第二个永远不能找到,比如说:
require'socket.core'
require'mime.core'
上面第二句话会出错误。两个颠倒顺序后,仍然是第二条语句出错。跟踪lua源码发现第二条语句获得的so仍然是第一条语句的so库。产生该问题的原因未知。
最后修改 loadlib.c中,将'xxxx.core'的查找修改为'xxxx_core'
luaconf.h修改:
#if defined(LUA_USE_LINUX) #define LUA_USE_POSIX #define LUA_USE_DLOPEN /* needs an extra library: -ldl */ #ifndef LUA_CLIB_DIRSEP #define LUA_USE_READLINE /* needs some extra libraries */ #define LUA_USE_STRTODHEX /* assume 'strtod' handles hex formats */ #endif #define LUA_USE_AFORMAT /* assume 'printf' handles 'aA' specifiers */ #define LUA_USE_LONGLONG /* assume support for long long */ #endif
loadlib.c修改
static int searcher_C (lua_State *L) { const char *name = luaL_checkstring(L, 1); const char *filename = findfile(L, name, "cpath", LUA_CLIB_DIRSEP); /*hack by alex*/ if (filename == NULL) return 1; /* module not found in this path */ return checkload(L, (loadfunc(L, filename, name) == 0), filename); }
编译:
make linux CC=mipsel-linux-uclibc-gcc MYCFLAGS='-DLUA_CLIB_DIRSEP=\"_\"'
luasocket目前支持5.3了,但低版本的linux内核支持较差,请用如下方式编译luasocket
./bin/luarocks install luasocket CC=mipsel-linux-uclibc-gcc LD=mipsel-linux-uclibc-gcc CFLAGS="-DIPV6_V6ONLY=27 -DAI_NUMERICSERV=-100 -DEAI_OVERFLOW=-101"
lanes折腾了我一天多,各种crash,郁闷啊 :(
修改src/threading.c,将prctl(PR_SET_NAME, _name, 0, 0, 0) 注释掉
即不支持set_debug_theadname接口
编译:
make LUAROCKS=1 CC=mipsel-linux-uclibc-gcc LD=mipsel-linux-uclibc-gcc CFLAGS="-I/opt/buildroot-gcc342/include -I/home/build/mipsel/include"