mips cpu低版本gcc编译lua问题总结

最近用到了rt5350,该cpu提供的gcc版本和linux内核都很低。

在编译其他工具库时都没发现问题,结果在编译luasocket,lanes出现问题。

1: lua或者lua的宿主程序必须主动链接pthread库

因为会用到dlopen,如果不主动链接pthread库,会crash。

具体请见https://sourceware.org/bugzilla/attachment.cgi?id=8223&action=edit


2: 不同工具库的core.so文件出现找不到

在使用类似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=\"_\"'

3: luasocket 编译

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"

4: lanes编译

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"

注意:如果没在lua的宿主程序中主动链接pthread库,lanes会莫名其妙的crash



你可能感兴趣的:(lua)