redis移植到mipsel-buildroot-linux-uclibc记录

移植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

本文链接地址: redis移植到mipsel-buildroot-linux-uclibc记录

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top