Можно ли собрать дампобраз из u-boot для арм.?

Я пытаюсь извлечь образ FIT, созданный mkimage на плате ARM.

Обычно, когда мы собираем u-boot, mkimage и dumpimage создаются для хоста.

Вместо этого я хотел бы выполнить кросс-компиляцию и установить в файл ramfs. Есть ли способ сделать это?

Переписать Makefile:

Я модифицировал make-файл таким образом, что он использует инструмент скрещивания рук как HOSTCC, я вижу, что файлы .o создаются для арки рук (файл *.o). ** Образец Makefile приведен ниже ** (просто я хочу, чтобы dumpimage был скомпилирован для arm, поэтому я закомментировал все остальные разделы) =>

# git diff 0b94ce5ed4a6c2cd0fec7b8337e776b03e387347
diff --git a/Makefile b/Makefile
index 88128ec..8ed7a33 100755
--- a/Makefile
+++ b/Makefile
@@ -7,6 +7,7 @@ PATCHLEVEL = 07
 SUBLEVEL =
 EXTRAVERSION =
 NAME =
+CC=arm-linux-gnueabihf-gcc

 # *DOCUMENTATION*
 # To see a list of typical targets execute "make help"
@@ -224,7 +225,7 @@ unexport CDPATH

 #########################################################################

-HOSTARCH := $(shell uname -m | \
+#HOSTARCH := $(shell uname -m | \
    sed -e s/i.86/x86/ \
        -e s/sun4u/sparc64/ \
        -e s/arm.*/arm/ \
@@ -233,6 +234,7 @@ HOSTARCH := $(shell uname -m | \
        -e s/ppc/powerpc/ \
        -e s/macppc/powerpc/\
        -e s/sh.*/sh/)
+HOSTARCH := arm

 HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
        sed -e 's/\(cygwin\).*/cygwin/')
@@ -254,8 +256,8 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
      else if [ -x /bin/bash ]; then echo /bin/bash; \
      else echo sh; fi ; fi)

-HOSTCC       = cc
-HOSTCXX      = c++
+HOSTCC       = arm-linux-gnueabihf-gcc
+HOSTCXX      = arm-linux-gnueabihf-g++
 HOSTCFLAGS   = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
 HOSTCXXFLAGS = -O2

@@ -283,7 +285,7 @@ os_x_before = $(shell if [ $(DARWIN_MAJOR_VERSION) -le $(1) -a \
    $(DARWIN_MINOR_VERSION) -le $(2) ] ; then echo "$(3)"; else echo "$(4)"; fi ;)

 # Snow Leopards build environment has no longer restrictions as described above
-HOSTCC       = $(call os_x_before, 10, 5, "cc", "gcc")
+HOSTCC       = $(call os_x_before, 10, 5, "arm-linux-gnueabihf-gcc", "arm-linux-gnueabihf-gcc")
 HOSTCFLAGS  += $(call os_x_before, 10, 4, "-traditional-cpp")
 HOSTLDFLAGS += $(call os_x_before, 10, 5, "-multiply_defined suppress")

@@ -392,13 +394,13 @@ export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
 # Rules shared between *config targets and build targets

 # Basic helpers built in scripts/
-PHONY += scripts_basic
-scripts_basic:
-       $(Q)$(MAKE) $(build)=scripts/basic
-       $(Q)rm -f .tmp_quiet_recordmcount
+#PHONY += scripts_basic
+#scripts_basic:
+#      $(Q)$(MAKE) $(build)=scripts/basic
+#      $(Q)rm -f .tmp_quiet_recordmcount

 # To avoid any implicit rule to kick in, define an empty command.
-scripts/basic/%: scripts_basic ;
+#scripts/basic/%: scripts_basic ;

 PHONY += outputmakefile
 # outputmakefile generates a Makefile in the output directory, if using a
@@ -470,11 +472,11 @@ ifeq ($(config-targets),1)
 KBUILD_DEFCONFIG := sandbox_defconfig
 export KBUILD_DEFCONFIG KBUILD_KCONFIG

-config: scripts_basic outputmakefile FORCE
-       $(Q)$(MAKE) $(build)=scripts/kconfig $@
+#config: scripts_basic outputmakefile FORCE
+#      $(Q)$(MAKE) $(build)=scripts/kconfig $@

-%config: scripts_basic outputmakefile FORCE
-       $(Q)$(MAKE) $(build)=scripts/kconfig $@
+#%config: scripts_basic outputmakefile FORCE
+#      $(Q)$(MAKE) $(build)=scripts/kconfig $@

 else
 # ===========================================================================
@@ -670,7 +672,7 @@ libs-y += $(if $(BOARDDIR),board/$(BOARDDIR)/)

 libs-y := $(sort $(libs-y))

-u-boot-dirs    := $(patsubst %/,%,$(filter %/, $(libs-y))) tools examples
+u-boot-dirs    := tools

 u-boot-alldirs := $(sort $(u-boot-dirs) $(patsubst %/,%,$(filter %/, $(libs-))))

@@ -1197,7 +1199,7 @@ u-boot.sym: u-boot FORCE

 # The actual objects are generated when descending,
 # make sure no implicit rule kicks in
-$(sort $(u-boot-init) $(u-boot-main)): $(u-boot-dirs) ;
+#$(sort $(u-boot-init) $(u-boot-main)): $(u-boot-dirs) ;

 # Handle descending into subdirectories listed in $(vmlinux-dirs)
 # Preset locale variables to speed up the build process. Limit locale
@@ -1205,24 +1207,30 @@ $(sort $(u-boot-init) $(u-boot-main)): $(u-boot-dirs) ;
 # make menuconfig etc.
 # Error messages still appears in the original language

-PHONY += $(u-boot-dirs)
-$(u-boot-dirs): prepare scripts
-       $(Q)$(MAKE) $(build)=$@
+PHONY += tools
+#-Xlinker -rpath-link=/home/phate/rpi/chroot-raspbian-armhf/usr/lib/arm-linux-gnueabihf
+LDFLAGS += -L./lib_sample/ -lcrypto
+LDFLAGS += -L/home/pritam/documents/workspace/codebase/linux/u-boot/codebase/openssl/openssl/ -lcrypto

-tools: prepare
+LD_LIBRARY_PATH=./lib_sample/
+export LD_LIBRARY_PATH
+tools: #prepare scripts
+       make $(build)=$@
+
+#tools: #prepare
 # The "tools" are needed early
-$(filter-out tools, $(u-boot-dirs)): tools
+#$(u-boot-dirs)):
 # The "examples" conditionally depend on U-Boot (say, when USE_PRIVATE_LIBGCC
 # is "yes"), so compile examples after U-Boot is compiled.
-examples: $(filter-out examples, $(u-boot-dirs))
+#examples: $(filter-out examples, $(u-boot-dirs))

 define filechk_uboot.release
-       echo "$(UBOOTVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
+#      echo "$(UBOOTVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
 endef

 # Store (new) UBOOTRELEASE string in include/config/uboot.release
-include/config/uboot.release: include/config/auto.conf FORCE
-       $(call filechk,uboot.release)
+#include/config/uboot.release: include/config/auto.conf FORCE
+#      $(call filechk,uboot.release)


 # Things we need to do before we recursively start building the kernel
@@ -1232,7 +1240,7 @@ include/config/uboot.release: include/config/auto.conf FORCE
 # version.h and scripts_basic is processed / created.

 # Listed in dependency order
-PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3
+#PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3

 # prepare3 is used to check if we are building in a separate output directory,
 # and if so do:
@@ -1257,7 +1265,7 @@ ifeq ($(wildcard $(LDSCRIPT)),)
    @/bin/false
 endif

-archprepare: prepare1 scripts_basic
+#archprepare: prepare1 scripts_basic

 prepare0: archprepare FORCE
    $(Q)$(MAKE) $(build)=.
@@ -1377,11 +1385,11 @@ checkarmreloc: u-boot
            false; \
    fi

-env: scripts_basic
-       $(Q)$(MAKE) $(build)=tools/$@
+#env: scripts_basic
+#      $(Q)$(MAKE) $(build)=tools/$@

-tools-only: scripts_basic $(version_h) $(timestamp_h)
-       $(Q)$(MAKE) $(build)=tools
+#tools-only: scripts_basic $(version_h) $(timestamp_h)
+#      $(Q)$(MAKE) $(build)=tools

 tools-all: export HOST_TOOLS_ALL=y
 tools-all: env tools ;
diff --git a/common/image-sig.c b/common/image-sig.c
index eda5e13..c6df99f 100644
--- a/common/image-sig.c
+++ b/common/image-sig.c
@@ -3,6 +3,7 @@
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
+//#undef USE_HOSTCC

 #ifdef USE_HOSTCC
 #include "mkimage.h"
diff --git a/scripts/Makefile b/scripts/Makefile
index 2f081f7..345a272 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -16,4 +16,4 @@ build_docproc: $(obj)/docproc
    @:

 # Let clean descend into subdirs
-subdir-        += basic kconfig
+#subdir-       += basic kconfig
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 06e5c20..9056412 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -269,8 +269,8 @@ define rule_cc_o_c
    $(cmd_modversions)                                                \
    $(call echo-cmd,record_mcount)                                    \
    $(cmd_record_mcount)                                              \
-       scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    \
-                                                     $(dot-target).tmp;  \
+#scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    \
+#                                                    $(dot-target).tmp;  \
    rm -f $(depfile);                                                 \
    mv -f $(dot-target).tmp $(dot-target).cmd
 endef
diff --git a/scripts/basic/Makefile b/scripts/basic/Makefile
index f883857..b281340 100644
--- a/scripts/basic/Makefile
+++ b/scripts/basic/Makefile
@@ -11,8 +11,8 @@
 # SPDX-License-Identifier:     GPL-2.0
 #

-hostprogs-y    := fixdep
-always         := $(hostprogs-y)
+#hostprogs-y   := fixdep
+#always                := $(hostprogs-y)

-# fixdep is needed to compile other host programs
-$(addprefix $(obj)/,$(filter-out fixdep,$(always))): $(obj)/fixdep
+## fixdep is needed to compile other host programs
+#$(addprefix $(obj)/,$(filter-out fixdep,$(always))): $(obj)/fixdep
diff --git a/tools/Makefile b/tools/Makefile
index f72294a..be9b221 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -225,6 +225,7 @@ HOST_EXTRACFLAGS += -include $(srctree)/include/libfdt_env.h \
            $(patsubst -I%,-idirafter%, $(filter -I%, $(UBOOTINCLUDE))) \
            -I$(srctree)/lib/libfdt \
            -I$(srctree)/tools \
+               -I/home/pritam/documents/workspace/codebase/linux/u-boot/codebase/openssl/openssl/include \
            -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE) \
            -DUSE_HOSTCC \
            -D__KERNEL_STRICT_NAMES \

ВЫВОД =>

make -f ./scripts/Makefile.build obj=tools
HOSTLD  tools/dumpimage
/home/pritam/documents/workspace/tools/sdks/bolide/petalinux/tools/linux-i386/gcc-arm-linux-gnueabi/bin/../lib/gcc/arm-linux-gnueabihf/5.2.1/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lssl
/home/pritam/documents/workspace/tools/sdks/bolide/petalinux/tools/linux-i386/gcc-arm-linux-gnueabi/bin/../lib/gcc/arm-linux-gnueabihf/5.2.1/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lcrypto
collect2: error: ld returned 1 exit status
scripts/Makefile.host:103: recipe for target 'tools/dumpimage' failed
make[1]: *** [tools/dumpimage] Error 1
Makefile:1217: recipe for target 'tools' failed
make: *** [tools] Error 2

ПРИМЕЧАНИЕ. Я загрузил и скомпилировал openssl для arm, и путь назначен LDFLAGS, как мы видим в исправлении Makefile.

Как я могу связать библиотеки, созданные отдельно для рук?

Пожалуйста, поправьте меня, если я ошибаюсь.


person pritam    schedule 11.04.2018    source источник
comment
Вам нужна среда для запуска инструментов кросс-компиляции. Обычно с ramfs существует ограниченный LIBC; такие как klibc, dietlibc, и т. д., или бизибокс. Вам нужно выполнить перекрестную компиляцию с этими заголовками, инструментами и т. д. rootfs, чтобы создать работающий файл dumpimage. Возможно, существует некоторая готовая конфигурация u-boot, но это требования для того, чтобы делать то, что вы хотите. Вы не дали достаточно информации о «ramfs».   -  person artless noise    schedule 11.04.2018
comment
Короче говоря, я хотел бы иметь скомпилированный образ дампа для платы arm, чтобы я мог вручную установить его в ramfs с зависимостями общей библиотеки (несколько используя ldd, buildroot для зависимостей). Я пытаюсь скомпилировать инструменты u-boot для руки (создать инструменты). В Makefile верхнего уровня я заменил HOSTCC=cc и HOSTCXX=c++ на crosstool (arm-linux-gnueabihf-gcc и g++ соответственно). Но со сценариями/базовыми/fixdep происходит сбой: невозможно выполнить двоичный файл: ошибка формата Exec. Так есть ли какой-нибудь метод для этого?   -  person pritam    schedule 12.04.2018
comment
Как вы собрали исполняемые файлы, которые находятся в rootfs?   -  person sawdust    schedule 12.04.2018
comment
rootfs создается yocto. И я экспортировал тот же кросс-инструмент (из yocto build sys) для кросс-компиляции u-boot (который предназначен для создания дампа).   -  person pritam    schedule 12.04.2018
comment
Вероятно, вам придется написать новый make-файл для кросс-компиляции этой программы для вашей цели. Слишком много переменных HOST*, кроме двух, которые вы пытались исправить.   -  person sawdust    schedule 12.04.2018
comment
Я модифицировал Makefile для arm, подробности приведены в теге ‹Rewrite Makefile :›. Но теперь я сталкиваюсь с проблемами при связывании библиотек.   -  person pritam    schedule 16.04.2018


Ответы (3)


Я столкнулся с этой проблемой, когда мне нужен был только инструмент dumpimage на Linux x86/64. Следующее сработало для меня.

1) wget ftp://ftp.denx.de /pub/u-boot/u-boot-latest.tar.bz2
2) cd u-boot-2017.09
3) make qemu-x86_defconfig
4) make tools

Инструменты хоста теперь готовы.

person sunil    schedule 28.07.2018
comment
Я хотел, чтобы эти инструменты были кросс-компилированы на ARM PLATFORM. - person pritam; 17.08.2018

Наряду с изменениями в Makefiles, как упоминалось выше, по проблеме криптографии и ssl-ссылки, я скомпилировал openssl для arm и связал *.a в Makefile верхнего уровня u-boot, используя HOSTLDFLAGS.

person pritam    schedule 30.04.2018

Вы можете создать кросс-компилированные инструменты U-boot. Пример: make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu-CROSS_BUILD_TOOLS=1 инструменты

Это даст вам перекрестно скомпилированные инструменты, сгенерированные в вашем каталоге инструментов.

person Manas Marwah    schedule 28.06.2018
comment
Я думаю, что перекрестные сборы должны иметь поддержку ssl и криптографии. Но в моем случае этих поддержек не было (xilinx cross tools). Пожалуйста, поправьте меня, если я ошибаюсь. - person pritam; 17.08.2018