OpenWrt Forum Archive

Topic: Compile grub, --target=x86_64-openwrt-linux, --build=i686-pc-linux-gnu

The content of this topic has been archived on 30 Mar 2018. There are no obvious gaps in this topic, but there may still be some posts missing at the end.

package/grub host-compile - success
package/grub compile - FAIL config.log - cannot create executables due to:

configure:2425: x86_64-openwrt-linux-gnu-gcc -m32 -O2 -pipe -march=athlon64....
...../x86_64-openwrt-linux-gnu/bin/ld: skipping incompatible ... lib/gcc/x86_64-openwrt-linux-gnu/4.6.1/libgcc.a when searching for -lgcc

In other words, the package is being compiled 32 bits and, no 32 bit libraries

...so, in an attempt to work around this, I enabled EXTRA_TARGET_ARCH_NAME=i686, resulting in the existence of staging_dir/toolchain-i386_gcc-4.6.1_glibc-2.13/lib which I presume contains the proper libraries.

also, added to grub/Makefile:

define Build/Configure
        $(call Build/Configure/Default,--target=i686-pc-openwrt-linux)
endef

...but, config.log still indicates:  --target=x86_64-openwrt-linux

...where I am stuck. Clearly, I do not know how to use EXTRA_TARGET_ARCH_NAME, nor how to enable the arch in Makefile. Google no help.

Any insight on how to fix this, or, another approach appreciated.

Thanks;
Bill

add this to grub/Makefile:

ifeq ($(PKG_ARCH),x86_64)
  # Need to compile package as 32 bits
  # Assumes EXTRA_TARGET_ARCH_NAME=i686 set in config
  TOOLS_DIR=$(TOPDIR)/staging_dir/toolchain-i386_gcc-$(GCCV)_$(LIBC)-$(LIBCV)

  TARGET_CFLAGS = \
  -L$(TOOLS_DIR)/lib \
  -L$(TOOLS_DIR)/lib/gcc/i486-openwrt-linux-gnu/$(GCCV) \
  -B$(TOOLS_DIR)/lib \
  -B$(TOOLS_DIR)/lib/gcc/i486-openwrt-linux-gnu/$(GCCV) \
  -I$(TOOLS_DIR)/usr/include \
  -I$(TOOLS_DIR)/include
endif

not claiming it works, just compiles. Stay tuned:)

could you please consolidate what exactly you did to get this working?  where did you enable EXTRA_TARGET_ARCH_NAME=i686 ?

EXTRA_TARGET_ARCH_NAME=i686 under "Toolchain Options" in menuconfig

export ARCH=x86_64 in env for this target

Makefile below, which is not sufficient for an x86_64 system since grub is broken for this. What you also need to do is during image make to swap the x86_64 stage files normally used with stage files from a working x86 (not 64) target. This is not for the fainthearted and, I cannot hold your hand, so, be prepared for a lot of "non-boot" debug. Will not be replying further.

#
# Copyright (C) 2006-2010 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk

PKG_NAME:=grub
PKG_VERSION:=0.97
PKG_RELEASE:=3

PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=ftp://alpha.gnu.org/gnu/grub
PKG_MD5SUM:=cd3f3eb54446be6003156158d51f4884

PKG_BUILD_DEPENDS:= grub/host
PKG_INSTALL:=1

include $(INCLUDE_DIR)/host-build.mk
include $(INCLUDE_DIR)/package.mk

define Package/grub
  SUBMENU:=Boot Loaders
  CATEGORY:=Utilities
  SECTION:=utils
  TITLE:=GRand Unified Bootloader
  URL:=http://www.gnu.org/software/grub/
  DEPENDS:=@TARGET_x86
endef

MY_CONFIGURE_ARGS += \
    --disable-auto-linux-mem-opt \
    --disable-hercules \
    --without-curses \

MY_CONFIGURE_VARS += \
    grub_cv_prog_objcopy_absolute=yes \

CONFIGURE_ARGS += $(MY_CONFIGURE_ARGS)

CONFIGURE_VARS += $(MY_CONFIGURE_VARS)

ifeq ($(HOST_OS),Darwin)
  HOST_CFLAGS += $(call host-cc-option,-m32)
  HOST_CFLAGS += $(call host-cc-option,-fnested-functions)
endif

ifeq ($(HOST_OS),FreeBSD)
  ifeq ($(HOST_ARCH),amd64)
    HOST_CFLAGS += $(call host-cc-option,-m32)
    HOST_CFLAGS += $(call host-cc-option,-B/usr/lib32)
    HOST_CFLAGS += $(call host-cc-option,-L/usr/lib32)
  endif
endif

HOST_CFLAGS += $(call host-cc-option,-fno-stack-protector)
HOST_CFLAGS += $(call host-cc-option,-U_FORTIFY_SOURCE)

ifeq ($(ARCH),x86_64)
  # Need to compile package as 32 bits
  # Assumes EXTRA_TARGET_ARCH_NAME=i686 set in config
  # TOOLS_DIR=$(TOPDIR)/staging_dir/toolchain-i386_gcc-$(GCCV)_$(LIBC)-$(LIBCV)
  # TOOLS_DIR=/mnt/sda1/OpenWrt_r29322/trunk/staging_dir/toolchain-i386_gcc-$(GCCV)_$(LIBC)-$(LIBCV)
  TOOLS_DIR=/home/rossb/OpenWrt/x86/OpenWrt_r29322/staging_dir/toolchain-i386_gcc-$(GCCV)_$(LIBC)-$(LIBCV)
  TARGET_CFLAGS = \
  -L$(TOOLS_DIR)/lib \
  -L$(TOOLS_DIR)/lib/gcc/i486-openwrt-linux-gnu/$(GCCV) \
  -B$(TOOLS_DIR)/lib \
  -B$(TOOLS_DIR)/lib/gcc/i486-openwrt-linux-gnu/$(GCCV) \
  -I$(TOOLS_DIR)/usr/include \
  -I$(TOOLS_DIR)/include

  LINK_STAGES=ln -sf $(ARCH)-openwrt $(1)/usr/lib/grub/i386-openwrt
  HOST_CFLAGS += $(call host-cc-option,-O2)
endif

HOST_CONFIGURE_ARGS += $(MY_CONFIGURE_ARGS) \
    --sbindir="$(STAGING_DIR_HOST)/bin" \
    --disable-graphics \

HOST_CONFIGURE_VARS += $(MY_CONFIGURE_VARS)

define Host/Configure
    (cd $(HOST_BUILD_DIR); aclocal && autoconf && automake)
    $(call Host/Configure/Default)
endef

ifeq ($(HOST_OS),Darwin)
  define Host/Compile
    $(MAKE) -C $(HOST_BUILD_DIR)/lib
    $(MAKE) -C $(HOST_BUILD_DIR)/stage2 libgrub.a
    $(MAKE) -C $(HOST_BUILD_DIR)/grub
  endef
  define Host/Install
    $(MAKE) -C $(HOST_BUILD_DIR)/grub install
  endef
endif

define Build/InstallDev
    $(INSTALL_DIR) $(1)/usr/lib
    $(CP) $(PKG_INSTALL_DIR)/usr/lib/grub $(1)/usr/lib/
    $(LINK_STAGES)
    # Temporary non-boot problem: use stage files from -m32 build
    # x86_64 Uncomment next 3
    cp -f ./files/e2fs_stage1_5 $(STAGING_DIR_HOST)/lib/grub/i386-pc
    cp -f ./files/stage1 $(STAGING_DIR_HOST)/lib/grub/i386-pc
    cp -f ./files/stage2 $(STAGING_DIR_HOST)/lib/grub/i386-pc
   
endef

define Package/grub/install
    $(INSTALL_DIR) $(1)/usr/bin
    $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
    $(INSTALL_DIR) $(1)/usr/lib
    $(CP) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/
    $(INSTALL_DIR) $(1)/usr/sbin
    $(CP) $(PKG_INSTALL_DIR)/usr/sbin/* $(1)/usr/sbin/
    # target/linux/x86/image/Makefile hardcodes i386-openwrt
        # link to X86-64 grub stages (x86_64) only
    $(LINK_STAGES)
    # Temporary non-boot problem: use stage files from -m32 build
    # x86_64 Uncomment next 3
    cp -f ./files/e2fs_stage1_5 $(1)/usr/lib/grub/i386-openwrt
    cp -f ./files/stage1 $(1)/usr/lib/grub/i386-openwrt
    cp -f ./files/stage2 $(1)/usr/lib/grub/i386-openwrt
endef

ifeq ($(HOST_ARCH),x86_64)
  define Require/working-gcc-m32
    echo 'int main(int argc, char **argv) { return 0; }' | \
        gcc -x c -o $(TMP_DIR)/a.out - -m32 -lc
  endef
endif

$(eval $(call Require,working-gcc-m32, \
    Please install 32 bit development files. (gcc-multilib on Debian/Ubuntu, gcc.i686, libgcc.i686, and glibc-devel.i686 on CentOS/Fedora/RHEL) \
))

$(eval $(call HostBuild))
$(eval $(call BuildPackage,grub))

Why BuilPackage is also needed?
since I should install this into host grub and sbin directory.

The discussion might have continued from here.