Возможная причина "Не удается разрешить символ"? - PullRequest
1 голос
/ 25 января 2011

Кросс-компиляция Lua, тестового модуля и реального модуля прошла нормально, но когда я загружаю реальный модуль на устройство, работающее uClinux , я получаю эту ошибку:

appliance::/var/tmp> ./lua -l dummy
Hello from dummy
Bye from dummy
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio

appliance::/var/tmp> ./lua -l luasql.sqlite3
./lua: can't resolve symbol '_luaL_ref'

У меня недостаточно опыта, чтобы понять причину, хотя Google, похоже, указывает на проблемы с общими библиотеками.Может быть, модуль ожидает какую-то библиотеку или определенную версию библиотеки, и ее там нет?

Кто-нибудь видел этот тип ошибки раньше?Как мне провести расследование?

Спасибо.


Редактировать: Вот файлы конфигурации / Makefile, которые я использовал для сборки Lua, SQLite3 и LuaSQL для SQLite3:

# cat /var/tmp/lua-5.1.4/src/Makefile
MYCFLAGS=
MYLDFLAGS=
MYLIBS=

export PATH:=$(PATH):/usr/src/baps/opt/uClinux/bfin-linux-uclibc/bin

TARGET_CROSS=bfin-linux-uclibc-
export CC=$(TARGET_CROSS)gcc
export STRIP=$(TARGET_CROSS)strip
export AR=$(TARGET_CROSS)ar rcu
export RANLIB=$(TARGET_CROSS)ranlib
export STAGING_DIR=/usr/src/baps/uClinux-dist/staging
export UCLINUX_LIB=/usr/src/baps/uClinux-dist/lib
export UCLINUX_ROOT_LIB=/usr/src/baps/uClinux-dist/root/lib
export CFLAGS=-O2 -Wall -Wmissing-prototypes -Wmissing-declarations -I$(STAGING_DIR)/usr/include -DLUA_USE_POSIX -DLUA_USE_DLOPEN
export LDFLAGS= -L$(STAGING_DIR)/usr/lib -L$(UCLINUX_LIB) -L$(UCLINUX_ROOT_LIB) -ldl -lm

...
$(LUA_T): $(LUA_O) $(LUA_A)
        $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(LUA_O) $(LUA_A)

$(LUAC_T): $(LUAC_O) $(LUA_A)
        $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(LUAC_O) $(LUA_A)
...
generic:
        $(MAKE) all

# cat /var/tmp/sqlite-amalgamation-3070400/Makefile
export PATH:=$(PATH):/usr/src/baps/opt/uClinux/bfin-linux-uclibc/bin

TARGET_CROSS=bfin-linux-uclibc-
export CC=$(TARGET_CROSS)gcc
export STRIP=$(TARGET_CROSS)strip
export AR=$(TARGET_CROSS)ar rcu
export RANLIB=$(TARGET_CROSS)ranlib
export CFLAGS=-O2 -Wall

libsqlite3.o:
        $(CC) $(CFLAGS) -DSQLITE_THREADSAFE=0 -o $@ -c sqlite3.c

# cat /var/tmp/luasql-2.1.1/config
...
LUA_INC= /var/tmp/lua-5.1.4/src
LIB_OPTION= -shared #for Linux
...
DRIVER_LIBS= /var/tmp/sqlite-amalgamation-3070400/libsqlite3.o
DRIVER_INCS= -I/var/tmp/sqlite-amalgamation-3070400

WARN= -Wall
INCS= -I$(LUA_INC)
CFLAGS= -O2 $(WARN) -I$(COMPAT_DIR) $(DRIVER_INCS) $(INCS) $(DEFS)
CC=/usr/src/baps/opt/uClinux/bfin-linux-uclibc/bin/bfin-linux-uclibc-gcc
LDFLAGS = -Wl,--trace,--print-map,--cref

# cat /var/tmp/luasql-2.1.1/Makefile
...
src/$(LIBNAME): $(OBJS)
        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(DRIVER_LIBS) $(LIB_OPTION)

Редактировать: После того, как мне сказали, что это, скорее всего, проблема со связыванием, и после дополнительных чтений и проб / ошибок я, наконец, обнаружил, что это было: При сборке Lua требуются следующие опции: "-Wl, -E "

Ответы [ 4 ]

2 голосов
/ 11 февраля 2012

В дополнение к приведенному выше ответу, если вы работаете на устройстве, вы должны убедиться, что вы не связываетесь с включениями или библиотеками в вашей системе сборки. Переменная $ PATH вашей системы разработки может указывать на локальные включаемые файлы и библиотеки. Кроме того, вам нужно убедиться, что библиотеки находятся в пригодном для использования месте на устройстве, обычно в / bin или /lib.

.
2 голосов
/ 02 марта 2012

Вот еще одна причина, когда вы получаете ошибки, например, не можете разрешить символ «open64» или не можете разрешить символ «setrlimit64» - возможно, вы используете приложение с поддержкой больших файлов в среде, которая не поддержать это. Не упустите макрос __USE_FILE_OFFSET64.

2 голосов
/ 25 января 2011

У меня нет опыта работы с lua, но в целом я могу сказать, что когда символ "неразрешен", это указывает на то, что компоновщик не может найти символ ни в одном из архивных файлов или библиотек, о которых ему говорят связать вместе. Вам нужно будет определить, какая библиотека определяет символ, и включить его в команду ссылки, обычно с флагом -l. Вам также может понадобиться указать флаг -L, указывающий каталог, в который входит эта библиотека. В вашем Makefile вы можете добавить эти флаги в переменную LDFLAGS.

0 голосов
/ 05 ноября 2015

Попробуйте удалить эту строку:

export STRIP=$(TARGET_CROSS)strip
...