移植redis到MT7621嵌入式设备上,虽然这个CPU性能不怎么样,也是够折腾,使用的是公司的buildroot工具链进行编译的。这里做个简单的记录。
首先是要搞定jemalloc库,库的编译倒是比较容易,因为有configure,所以也就容易了很多了:
./configure --enable-autogen --host=mipsel-linux --prefix=/home/ping/source/lib/ --with-lg-quantum=3 --with-jemalloc-prefix=je_ --enable-cc-silence
jemalloc搞定后,还需要搞定hiredis以及lua,都搞定后,就开始搞redis了。编译的redis版本是3.2.9。
看了下redis的makefile也是够简单的。先把工程需要的一些配置整理进去:
default: all .DEFAULT: cd src && uname_S=Linux PREFIX=$(ROMFSDIR)/usr/ $(MAKE) $@ V=1 CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" install: cd src && $(MAKE) $@ .PHONY: install
添加了 V=1 CFLAGS=”$(CFLAGS)” LDFLAGS=”$(LDFLAGS)” ,V=1开起来,方便到时候编译的时候出错调试。
开始编译,出现了debug.c中的execinfo.h头文件找不到。宏HAVE_BACKTRACE是有开启的,查了下,这个是和C库相关的。make menuconfig查看了下uClibc:
需要开启UCLIBC_HAS_BACKTRACE这个开关:
Symbol: UCLIBC_HAS_BACKTRACE [=y] | Prompt: Add support for application self-debugging | Defined at extra/Configs/Config.in:2360 | Depends on: HAVE_SHARED | Location: | -> Development/debugging options
再次编译工程,重新编译了uClibc,结果出现了函数program_invocation_name未能链接到,原因是因为UCLIBC_HAS_PROGRAM_INVOCATION_NAME没有开启。
Symbol: UCLIBC_HAS_PROGRAM_INVOCATION_NAME [=y] | Prompt: Support for program_invocation_name | Defined at extra/Configs/Config.in:724 | Location: | -> General Library Settings
开启后,再次编译。
结果链接找不到backtrace等函数,比较奇怪,uClibc已经开启了UCLIBC_HAS_BACKTRACE 开关了,去uClibc的文件夹使用readelf去查看链接符。
readelf -s libuClibc-0.9.33.2.so | grep backtrace
确实没有在libuClibc里面,但是在libubacktrace-0.9.33.2.so库中,看来uClibc与glibc是有些差异的。
readelf -s libubacktrace-0.9.33.2.so | grep backtrace 5: 00000730 808 FUNC GLOBAL DEFAULT 7 backtrace_symbols 6: 00000608 284 FUNC GLOBAL DEFAULT 7 backtrace 7: 00000a60 656 FUNC GLOBAL DEFAULT 7 backtrace_symbols_fd 19: 00000000 0 FILE LOCAL DEFAULT ABS backtrace.c 20: 00000580 136 FUNC LOCAL DEFAULT 7 backtrace_helper 22: 00011050 4 OBJECT LOCAL DEFAULT 14 unwind_backtrace 23: 00000000 0 FILE LOCAL DEFAULT ABS backtracesyms.c 24: 00000000 0 FILE LOCAL DEFAULT ABS backtracesymsfd.c 34: 00000730 808 FUNC GLOBAL DEFAULT 7 backtrace_symbols 38: 00000608 284 FUNC GLOBAL DEFAULT 7 backtrace 39: 00000a60 656 FUNC GLOBAL DEFAULT 7 backtrace_symbols_fd
修改redis的Makefile加上对ubacktrace的链接:
FINAL_LIBS += -lubacktrace
至此,redis编译成功。
转载请注明: 转载自elkPi.com