Added a linker scripts, instead of using gcc directly.

This commit is contained in:
RoyR
2026-03-16 11:47:38 -04:00
parent 01cb40babc
commit 8a60ebbfbf
4 changed files with 16 additions and 4 deletions

View File

@@ -4,8 +4,8 @@ CC = gcc
CFLAGS = -std=c99 -Wall -O2
NASM = nasm
NASMFLAGS = -f elf32
LD = gcc
LDFLAGS = -m32
LD = ./commonl
LDFLAGS =
# Compiler
COMPILER = common
@@ -49,7 +49,7 @@ $(EXAMPLES): %: $(EXAMPLES_DIR)/%.cm $(COMPILER)
@echo "Building $@..."
./$(COMPILER) $(EXAMPLES_DIR)/$@.cm $@.asm
$(NASM) $(NASMFLAGS) $@.asm -o $@.o
$(LD) $(LDFLAGS) $@.o -o $@ -no-pie
$(LD) $(LDFLAGS) $@.o -o $@
@echo "Built $@ successfully"
# Run all examples

View File

@@ -302,6 +302,7 @@ gcc -m32 main.c common.o -o program
```
.
├── common.c # Compiler source (2000 LOC)
├── commonl # Linker
├── Makefile # Build automation
├── run_tests.sh # Quick test script

11
commonl Executable file
View File

@@ -0,0 +1,11 @@
#!/bin/bash
# Public domain / CC0. Use freely for any purpose. RoyR 2026
GCC_NO_PIE=1
echo 'int main() {}' | gcc -E -no-pie - -o /dev/null || GCC_NO_PIE=0
if [ $GCC_NO_PIE = 1 ];then
gcc -m32 -no-pie "$@"
else
gcc -m32 "$@"
fi

View File

@@ -72,7 +72,7 @@ static void run_test(Test *t) {
}
/* Link */
if (run_command("gcc -m32 /tmp/test.o -o /tmp/test 2>/tmp/test.err -no-pie") != 0) {
if (run_command("./commonl /tmp/test.o -o /tmp/test 2>/tmp/test.err") != 0) {
printf("FAIL (linker error)\n");
test_failed++;
return;