Здравствуйте!
Пытаюсь собрать свой пакет, который будет использовать входящую в состав Entware библиотеку libmodbus.
Успешно установил тулчейн, собрал и запустил "Helloworld" отсюда: https://github.com/zyxmon/zyxel-keenetic-packages/tree/master/package/built/helloworld
Далее пытаюсь запустить свой пакет modsensor, который будет использовать функционал библиотеки libmodbus. Программа собирается, но на роутере не работает, выдавая ошибку
/opt/bin/sh: modsensor: not found
Ошибка возникает, когда я пытаюсь слинковать исполняемый файл с библиотекой libmodbus. Функции библиотеки пока что даже не используются. Библиотека на роутере установлена, сам файл тоже есть в наличии:
root@Keenetic_Giga:/opt/bin# file modsensor
modsensor: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 3.2.0, stripped
strace выдает следующее:
root@Keenetic_Giga:/opt/bin# strace modsensor
execve("/opt/bin/modsensor", ["modsensor"], 0x7fe7bda0 /* 20 vars */) = -1 ENOENT (No such file or directory)
fstat64(2, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 1), ...}) = 0
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
getpid() = 6013
exit_group(1) = ?
+++ exited with 1 +++
вывод ldd:
root@Keenetic_Giga:/opt/bin# ldd modsensor
libmodbus.so.5 => /opt/lib/libmodbus.so.5 (0x77b76000)
libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x77b50000)
libc.so.6 => /opt/lib/libc.so.6 (0x779c2000)
/lib/ld.so.1 => /opt/lib/ld.so.1 (0x77b8f000)
Вроде как и файл есть, и ссылки на библиотеки верные, однако программа не работает. Подозреваю, что ошибка может быть в Makefile.
Makefile для исполняемого файла:
LIBS=-lmodbus
modsensor: modsensor.o
$(CC) $(LDFLAGS) $(LIBS) modsensor.o -o modsensor
modsensor.o: modsensor.c
$(CC) $(CFLAGS) -c modsensor.c
clean:
rm *.o modsensor
Makefile для пакета:
include $(TOPDIR)/rules.mk
PKG_NAME:=modsensor
PKG_VERSION:=1.0.0
PKG_RELEASE:=1
TARGET_CFLAGS=-I$(STAGING_DIR)/opt/include/modbus
TARGET_LDFLAGS=-L$(STAGING_DIR)/opt/lib
PKG_BUILD_DEPENDS:=libmodbus
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
SECTION:=utils
CATEGORY:=Utilities
DEPENDS:=+libmodbus
TITLE:=$(PKG_NAME)
MAINTAINER:=SuperExpert
endef
define Package/$(PKG_NAME)/description
reading sensor`s values from modbus device.
endef
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) \
CFLAGS="$(TARGET_CFLAGS)" \
LDFLAGS="$(TARGET_LDFLAGS)" \
$(TARGET_CONFIGURE_OPTS)
endef
CONFIGURE_VARS+=\
CC="$(TOOLCHAIN_DIR)/bin/$(TARGET_CC)"
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/opt/bin
$(CP) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/opt/bin
endef
$(eval $(call BuildPackage,$(PKG_NAME)))
Если убрать линковку с libmodbus, то программа работает.
Помогите составить Makefile с линковкой библиотеки. Возможно, если библиотеку включить непосредственно в программу то все заработает, но хотелось бы разобраться как сделать правильно.