Jump to content

Помогите собрать пакет с Dynamically Linked Libraries


Recommended Posts

Здравствуйте!

Пытаюсь собрать свой пакет, который будет использовать входящую в состав 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 с линковкой библиотеки. Возможно, если библиотеку включить непосредственно в программу то все заработает, но хотелось бы разобраться как сделать правильно.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...