Hallo Leute, ich benötige Eure Hilfe bei einer Kompilierung eines speziellen Treibers.
Dieser wird später benötigt um Xilinx FPGA per jtag zu laden.
Leider benötige ich eine ältere Xilinx ISE Version 11.1 um einen alten CPLD zu programmieren.

Was ich bisher gemacht habe:
Kompilieren des Treibers für 64bit Systeme. Das funktioniert.
Kompilieren des Treibers auf ein 64 bit Arch-Linux Systems für 32 bit. Ergab Fehler wie weiter unten beschrieben.
Folgende libs wurden zuerst installiert.

glibc lib32-glibc lib-usb lib32-libusb libusb-compat lib32-libusb-compat

Das ist die Fehlerausgabe nach dem Kompilieren:
$ make lib32
make LIBVER=32 clean all
make[1]: Verzeichnis „/home/gl/temp/usb-driver“ wird betreten
rm -f libusb-driver.so libusb-driver-DEBUG.so
cc -Wall -fPIC -DUSB_DRIVER_VERSION="\"2017-05-13 09:57:38\""  -m32 -DJTAGKEY usb-driver.c xpcu.c parport.c config.c jtagmon.c jtagkey.c -o libusb-driver.so -ldl -lusb -lpthread -L/usr/lib -lftdi -L/usr/lib -lusb -shared
usb-driver.c: In Funktion »access«:
usb-driver.c:634:5: Warnung: nonnull argument »pathname« compared to NULL [-Wnonnull-compare]
  if (pathname && !strcmp(pathname, "/dev/windrvr6")) {
     ^
parport.c: In Funktion »parport_transfer«:
parport.c:21:23: Warnung: Variable »last_pp_write« gesetzt, aber nicht verwendet [-Wunused-but-set-variable]
  static unsigned char last_pp_write = 0;
                       ^~~~~~~~~~~~~
/usr/bin/ld: skipping incompatible /usr/lib/libdl.so when searching for -ldl
/usr/bin/ld: skipping incompatible /usr/lib/libdl.a when searching for -ldl
/usr/bin/ld: skipping incompatible /usr/lib/libdl.so when searching for -ldl
/usr/bin/ld: skipping incompatible /usr/lib/libdl.a when searching for -ldl
/usr/bin/ld: skipping incompatible /usr/lib/libusb.so when searching for -lusb
/usr/bin/ld: skipping incompatible /usr/lib/libusb.so when searching for -lusb
/usr/bin/ld: skipping incompatible /usr/lib/libpthread.so when searching for -lpthread
/usr/bin/ld: skipping incompatible /usr/lib/libpthread.a when searching for -lpthread
/usr/bin/ld: skipping incompatible /usr/lib/libpthread.so when searching for -lpthread
/usr/bin/ld: skipping incompatible /usr/lib/libpthread.a when searching for -lpthread
/usr/bin/ld: skipping incompatible /usr/lib/libftdi.so when searching for -lftdi
/usr/bin/ld: skipping incompatible /usr/lib/libftdi.so when searching for -lftdi
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/../../../libftdi.so when searching for -lftdi
/usr/bin/ld: skipping incompatible /usr/lib/libftdi.so when searching for -lftdi
/usr/bin/ld: cannot find -lftdi
/usr/bin/ld: skipping incompatible /usr/lib/libusb.so when searching for -lusb
/usr/bin/ld: skipping incompatible /usr/lib/libusb.so when searching for -lusb
/usr/bin/ld: skipping incompatible /usr/lib/libgcc_s.so.1 when searching for libgcc_s.so.1
/usr/bin/ld: skipping incompatible /usr/lib/libgcc_s.so.1 when searching for libgcc_s.so.1
collect2: Fehler: ld gab 1 als Ende-Status zurück
make[1]: *** [Makefile:29: libusb-driver.so] Fehler 1
make[1]: Verzeichnis „/home/gl/temp/usb-driver“ wird verlassen
make: *** [Makefile:35: lib32] Fehler 2
Wenn ich jetzt so rumforsche von welchem Paket die /usr/lib/libdl.so her ist, dann gibt pacman das aus:
pacman -Qo /usr/lib/libdl.so
/usr/lib/libdl.so ist in glibc 2.25-1 enthalten
Wenn ich jetzt ein pacman -Ql lib32-glibc eingebe, dann findet pacman die so:
pacman -Ql lib32-glibc /usr/lib32/libdl.so
Kann es sein, dass bei der Kompilierung fälschlicherweise immer im Pfad /usr/lib statt /usr/lib32/ zugegriffen wird?
Wie kann man das ändern?

Falls Jemand das von Euch probieren möchte, so kann man den Quellcode runterladen. (Ist nur wenig)
git clone git://git.zerfleddert.de/usb-driver (Der Link ist wirklich korrekt).

Hier ist noch der Inhalt vom Makefile
#Add -DFORCE_PC3_IDENT to CFLAGS to force the identification of
#a Parallel Cable III
#Add -DNO_USB_RESET to disable the hard reset of the cable when
#opening the device
CFLAGS=-Wall -fPIC -DUSB_DRIVER_VERSION="\"$(shell stat -c '%y' usb-driver.c |cut -d\. -f1)\"" #-DFORCE_PC3_IDENT -DNO_USB_RESET

LIBS=-ldl -lusb -lpthread

SRC=usb-driver.c xpcu.c parport.c config.c jtagmon.c
HEADER=usb-driver.h xpcu.h parport.h jtagkey.h config.h jtagmon.h

ifeq ($(LIBVER),32)
CFLAGS += -m32
endif

FTDI := $(shell libftdi-config --libs 2>/dev/null)
ifneq ($(FTDI),)
SRC += jtagkey.c
CFLAGS += -DJTAGKEY
LIBS += $(FTDI)
endif

SOBJECTS=libusb-driver.so libusb-driver-DEBUG.so

all: $(SOBJECTS)
	@file libusb-driver.so | grep x86-64 >/dev/null && echo Built library is 64 bit. Run \`make lib32\' to build a 32 bit version || true

libusb-driver.so: $(SRC) $(HEADER) Makefile
	$(CC) $(CFLAGS) $(SRC) -o $@ $(LIBS) -shared

libusb-driver-DEBUG.so: $(SRC) $(HEADER) Makefile
	$(CC) -DDEBUG $(CFLAGS) $(SRC) -o $@ $(LIBS) -shared

lib32:
	$(MAKE) LIBVER=32 clean all

clean:
	rm -f $(SOBJECTS)

.PHONY: clean all lib32
Vielen Dank im Vorraus!!
Gruß aus DN
Greg
Die einfachste Möglichkeit 32bit auf einem 64bit System zu kompilieren, ist sich eine komplette 32bit Chroot zu erstellen:

Als root:

mkdir /home/archchroot
linux32 pacstrap -d /home/archchroot/ base base-devel
linux32 arch-chroot /home/archchroot/

Dort dann dein Paket bauen...
Hm, ich hätte jetzt gemint, du brauchst ein multilib-System.
Du könntest auch
CFLAGS += -m32 -L /usr/lib32
im Makefile ändern
Moin Allerseits.
Besten Dank für Eure Antworten!!
drcux schriebDie einfachste Möglichkeit 32bit auf einem 64bit System zu kompilieren, ist sich eine komplette 32bit Chroot zu erstellen:
Als root:
mkdir /home/archchroot
linux32 pacstrap -d /home/archchroot/ base base-devel
linux32 arch-chroot /home/archchroot/
Dort dann dein Paket bauen...
So ähnlich habe ich es jetzt gemacht. Ich habe eine Partition neu erstellt und darin ein Arch-32bit installiert. Ich habe sogar noch ein älteres ISO-Image mit der Möglichkeit noch ein 32bit Arch zu installieren. Obwohl es auch mit den arch-install-scripts geklappt hätte. Aber mit der Macht der Gewohnheit habe ich eben das Isoimage benutzt. Per chroot dort rein und das Zeug kompiliert.
Ob die FPGAs sich dann programmieren lassen kann ich erst am Montag testen. Somit wäre das Kompilierungsproblem gelöst.
stefanhusmann schriebHm, ich hätte jetzt gemeint, du brauchst ein multilib-System.
Multilib ist bei mir entsprechend drin. Bei linux32 habe ich erwartet, dass nicht /usr/lib/.. sondern /usr/lib32/.. bei der Kompilierung genommen wird.
Ob man das am Makefile gesondert angeben muss??? Meine Programmierkenntnisse reichen da nicht aus. Deshalb habe ich es so ähnlich gemacht wie DRCUX es beschrieben hat.
drcux schriebDu könntest auch
CFLAGS += -m32 -L /usr/lib32
im Makefile ändern
Zu spät, aber ich werde es morgen auch testen. Ich meine sowas ähnliches habe ich gehofft dass das per Makefile gehen müßte.
Ein schönes WE!!
Gruß aus DN
Greg

Nachtrag:
Habe gerade mal Makefile mit CFLAGS += -m32 -L /usr/lib32 ausprobiert.
Ich benötige dazu noch lib32-libftdi-compat gibts leider nicht im AUR. Also mal selber das PKGBUILD von libftdi-compat geändert.
Ein makepkg --skippgpcheck angestoßen. Bricht leider ab mit
-o .libs/libftdipp.so.1.20.0
../src/.libs/libftdi.so: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:314: libftdipp.la] Fehler 1
make[2]: Verzeichnis „/home/gl/Downloads/lib32-libftdi-compat/src/libftdi-0.20/ftdipp“ wird verlassen
make[1]: *** [Makefile:418: all-recursive] Fehler 1
make[1]: Verzeichnis „/home/gl/Downloads/lib32-libftdi-compat/src/libftdi-0.20“ wird verlassen
make: *** [Makefile:285: all] Fehler 2
==> FEHLER: Ein Fehler geschah in build().
    Breche ab...
[gl@gregina2 lib32-libftdi-compat]$ 
Hier mal mein PKGBUILD zu lib32-libftdi-compat:
# $Id$
# Maintainer:Greg  lib32 Version gebaut

_pkgbase=libftdi-compat
pkgname=lib32-${_pkgbase}
#pkgname=libftdi-compat
pkgver=0.20
pkgrel=3
pkgdesc="A library to talk to FTDI chips"
arch=('i686' 'x86_64')
url="http://www.intra2net.com/en/developer/libftdi/download.php"
license=('GPL2' 'LGPL2.1')
depends=('libusb-compat' 'gcc-libs')
makedepends=('boost')
source=(http://www.intra2net.com/en/developer/libftdi/download/libftdi-$pkgver.tar.gz{,.sig})
sha1sums=('4bc6ce70c98a170ada303fbd00b8428d8a2c1aa2'
          'SKIP')

#validpgpkeys=('3CEA9B8868BC3852618EB5B4707F91A424F006F5')  # Intra2net open source

build() {
  cd libftdi-$pkgver
  export CC="gcc -m32"
  export PKG_CONFIG_PATH="/usr/lib32/pkgconfig"
  ./configure --prefix=/usr --libdir=/usr/lib32 --without-examples
  make
}

package() {
  cd  libftdi-$pkgver
  make DESTDIR="$pkgdir" install
}

Nachtrag2: Habe gerade den 32bit Treiber mit impact und dem alten cpld ausprobiert. Alles funktioniert wieder.
Aufruf von impact wie folgt:
LD_PRELOAD=file:/Pfad_zum_treiber32bit/libusb-driver.so /Pfad_von_ise/ISE/bin/lin/impact