feat: Makefile, strlen and strcpy

This commit is contained in:
lohhiiccc 2026-06-11 18:49:33 +02:00
parent fa6e7916ef
commit 60d76c0453
6 changed files with 118 additions and 0 deletions

View file

@ -0,0 +1,45 @@
NASM=nasm
NASMFLAGS=-f elf64 -g -F dwarf
AR=ar
ARFLAGS=rcs
CC=gcc
CFLAGS=-Wall -g
SRC_DIR=src
OBJ_DIR=obj
LIB_NAME=mylib
STATIC_LIB=lib$(LIB_NAME).a
SHARED_LIB=lib$(LIB_NAME).so
SRCS=$(SRC_DIR)/ft_strlen.s \
$(SRC_DIR)/ft_strcpy.s
OBJS=$(patsubst $(SRC_DIR)/%.s,$(OBJ_DIR)/%.o,$(SRCS))
DEPS=$(OBJS:.o=.d)
.PHONY: all clean dirs static shared
all: dirs $(STATIC_LIB) $(SHARED_LIB)
dirs:
@mkdir -p $(OBJ_DIR)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.s
$(NASM) $(NASMFLAGS) $< -o $@
$(STATIC_LIB): $(OBJS)
$(AR) $(ARFLAGS) $@ $^
$(SHARED_LIB): $(OBJS)
$(CC) -shared -o $@ $^
static: $(STATIC_LIB)
shared: $(SHARED_LIB)
test: test.c $(STATIC_LIB)
$(CC) $(CFLAGS) test.c -L. -l$(LIB_NAME) -o test -Wl,-rpath=.
clean:
rm -rf $(OBJ_DIR) $(STATIC_LIB) $(SHARED_LIB) test
-include $(DEPS)

View file

25
src/ft_strcpy.s Normal file
View file

@ -0,0 +1,25 @@
global ft_strcpy
section .text
; rdi = dest, rsi = src
; rax = return value
; should copy src in dest and return dest
ft_strcpy:
mov rax, rdi
.loop:
mov dl, byte [rsi]
test dl, dl
je .done
mov byte [rdi], dl
inc rsi
inc rdi
jmp .loop
.done:
mov byte [rdi], 0x0
mov rdi, rax
ret

17
src/ft_strlen.s Normal file
View file

@ -0,0 +1,17 @@
global ft_strlen
section .text
ft_strlen:
mov rax, rdi
.loop:
mov dl, byte [rax]
test dl, dl
je .done
inc rax
jmp .loop
.done:
sub rax, rdi
ret

17
src/mylib.h Normal file
View file

@ -0,0 +1,17 @@
#ifndef MYLIB_H
#define MYLIB_H
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
size_t ft_strlen(char *str);
char *ft_strcpy(char *dest, const char *src);
#ifdef __cplusplus
}
#endif
#endif

14
test.c Normal file
View file

@ -0,0 +1,14 @@
#include "src/mylib.h"
#include <stdio.h>
int
main(void)
{
char dest[16];
const char src[] = "Hello, world!\n";
printf("%s%s", ft_strcpy(dest, src), dest);
printf("%s", src);
printf("%ld\n", ft_strlen(dest));
printf("%ld\n", strlen(dest));
}