0
votes

I have a small program that's made of an assembly function and a C function which calls it. Now the program compiles and works perfectly on a UNIX system but when using the makefile in cygwin i get the following error:

gcc -m32 -g -c -o main.o main.c gcc -g -m32 -o ass0 main.o myasm.o main.o: In function main': /cygdrive/c/ass0/main.c:15: undefined reference to_strToLeet' collect2: error: ld returned 1 exit status makefile:3: recipe for target 'ass0' failed make: *** [ass0] Error 1

code of the main.c file :

#include <stdio.h>
# define MAX_LEN 100     // Maximal line size

extern int strToLeet (char*);

int main(void) {

  char str_buf[MAX_LEN];
  int str_len = 0;

  printf("Enter a string: ");

  fgets(str_buf, MAX_LEN, stdin);  // Read user's command line string

  str_len = strToLeet (str_buf);         // Your assembly code function

  printf("\nResult string:%s\nNumber of letters converted to Leet: %d\n",str_buf,str_len);
}

start of assembly code:

section .data                           ; data section, read-write
        an:    DD 0                     ; this is a temporary var

section .text                           ; our code is always in the .text section
        global strToLeet                ; makes the function appear in global scope
        extern printf                   ; tell linker that printf is defined elsewhere  
strToLeet:                              ; functions are defined as labels
        push    ebp                     ; save Base Pointer (bp) original value
        mov     ebp, esp                ; use base pointer to access stack contents
        pushad                          ; push all variables onto stack
        mov ecx, dword [ebp+8]  ; get function argument

makefile code :

all: ass0
ass0: main.o myasm.o
        gcc -g -m32 -o ass0 main.o myasm.o

main.o: main.c
        gcc -m32 -g -c -o main.o main.c
myasm.o: myasm.s
        nasm -g -f elf -l ass0list -o myasm.o myasm.s

help would be most appriciated

1
'strToLeet' seems to be a function. in C, all that is needed is a prototype, not an 'extern' statement.. - user3629249
does the asm file contain the necessary statement to make the strToLeet() function visible in the rest of the application? - user3629249
strToLeet is a function thats written in assembly, - yair
I would like to remind you again the question is mainly about Cygwin since the program compiles and executes perfectly on a UNIX system. - yair
Try to modify your prototype to become extern int strToLeet (char*) asm ("strToLeet"); - tivn

1 Answers

1
votes

Solved by user 'tvin' - Try to modify your prototype to become extern int strToLeet (char*) asm ("strToLeet"); – tivn