I have the following files in my project:
file.s
and STR_ARR.s
as x86 assembly source files.
file.c
and main.c
as C source files.
directoryListing.cpp
as C++ source files.
I am working on a 64 bit distribution of arch and I need to compile these file both for linux and windows 32 bit. Right now the linux part of the project works fine, this is my makefile:
C_OPTIONS = -m32 -fPIC
build-elf: STR_ARR.elf.o directoryListing.elf.o main.elf.o file.s.elf.o file.elf.o
$(CC) $(C_OPTIONS) STR_ARR.elf.o directoryListing.elf.o file.s.elf.o file.elf.o main.elf.o -o $(OUTPUT_DIR)/$(elfC_NAME).elf -static -lstdc++
main.elf.o: main.c
$(CC) $(C_OPTIONS) -c main.c -o main.elf.o
directoryListing.elf.o: directoryListing.cpp directoryListing.hpp
$(CXX) $(C_OPTIONS) -std=c++17 -c directoryListing.cpp -o directoryListing.elf.o
STR_ARR.elf.o: STR_ARR.s STR_ARR.h
$(CC) $(C_OPTIONS) -c STR_ARR.s -o STR_ARR.elf.o
file.elf.o: file.c file.h
$(CC) $(C_OPTIONS) -c file.c -o file.elf.o
file.s.elf.o: file.s file.s.h
$(CC) $(C_OPTIONS) -c file.s -o file.s.elf.o
I am trying to cross compile the project using mingw32 and this make file:
CXX_WIN = i686-w64-mingw32-g++
CC_WIN = i686-w64-mingw32-gcc
C_OPTIONS = -m32 -fPIC
build-exe: STR_ARR.exe.o directoryListing.exe.o main.exe.o file.s.exe.o file.exe.o
$(CC_WIN) $(C_OPTIONS) STR_ARR.exe.o directoryListing.exe.o file.s.exe.o file.exe.o main.exe.o -o $(OUTPUT_DIR)/$(exeC_NAME).exe -static -lstdc++
main.exe.o: main.c
$(CC_WIN) $(C_OPTIONS) -c main.c -o main.exe.o
directoryListing.exe.o: directoryListing.cpp directoryListing.hpp
$(CXX_WIN) $(C_OPTIONS) -std=c++17 -c directoryListing.cpp -o directoryListing.exe.o
STR_ARR.exe.o: STR_ARR.s STR_ARR.h
$(CC_WIN) $(C_OPTIONS) -c STR_ARR.s -o STR_ARR.exe.o
file.exe.o: file.c file.h
$(CC_WIN) $(C_OPTIONS) -c file.c -o file.exe.o
file.s.exe.o: file.s file.s.h
$(CC_WIN) $(C_OPTIONS) -c file.s -o file.s.exe.o
But no matter what I do the linker seems to be unable to find the libc functions and the SA_*
functions in STR_ARR.s
.
I have tried building a shared library, explicitly linking -lc
and and -lcrt
and reinstalling mingw but nothing seems to work.
Here's the output of calling make:
$ make build-exe
i686-w64-mingw32-gcc -m32 -fPIC -c STR_ARR.s -o STR_ARR.exe.o
i686-w64-mingw32-g++ -m32 -fPIC -std=c++17 -c directoryListing.cpp -o directoryListing.exe.o
i686-w64-mingw32-gcc -m32 -fPIC -c main.c -o main.exe.o
i686-w64-mingw32-gcc -m32 -fPIC -c file.s -o file.s.exe.o
i686-w64-mingw32-gcc -m32 -fPIC -c file.c -o file.exe.o
i686-w64-mingw32-gcc -m32 -fPIC STR_ARR.exe.o directoryListing.exe.o file.s.exe.o file.exe.o main.exe.o -o ../target/classes/.exe -static -lstdc++
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0x6): undefined reference to `malloc'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0x4f): undefined reference to `free'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0x66): undefined reference to `free'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0xa4): undefined reference to `realloc'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0xee): undefined reference to `strlen'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0xf8): undefined reference to `malloc'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0x117): undefined reference to `strcpy'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: directoryListing.exe.o:directoryListing.cpp:(.text+0x1b): undefined reference to `SA_new'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: directoryListing.exe.o:directoryListing.cpp:(.text+0x121): undefined reference to `SA_add'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: directoryListing.exe.o:directoryListing.cpp:(.text+0x13f): undefined reference to `SA_free'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: directoryListing.exe.o:directoryListing.cpp:(.text+0x14a): undefined reference to `SA_new'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.s.exe.o:fake:(.text+0x26): undefined reference to `remove'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.s.exe.o:fake:(.text+0x2c): undefined reference to `strcpy'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.s.exe.o:fake:(.text+0x39): undefined reference to `strcat'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.s.exe.o:fake:(.text+0x3e): undefined reference to `remove'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.exe.o:file.c:(.text+0x12d): undefined reference to `SA_free'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.exe.o:file.c:(.text+0x1ae): undefined reference to `SA_new'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.exe.o:file.c:(.text+0x289): undefined reference to `SA_move'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.exe.o:file.c:(.text+0x448): undefined reference to `calculateTimeToCharge_ASM'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.exe.o:file.c:(.text+0x4a6): undefined reference to `deleteFiles_ASM'
collect2: error: ld returned 1 exit status
make: *** [makefile:30: build-exe] Error 1
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…