与 cygwin 链接
Linking with cygwin
我有一个小程序,它由一个汇编函数和一个调用它的 C 函数组成。
现在该程序可以在 UNIX 系统上编译并完美运行,但是在 cygwin 中使用 makefile 时出现以下错误:
gcc -m32 -g -c -o main.o main.c
gcc -g -m32 -o ass0 main.o myasm.o
main.o: 在函数中 main':
/cygdrive/c/ass0/main.c:15: undefined reference to
_strToLeet'
collect2:错误:ld 返回 1 退出状态
makefile:3:目标 'ass0' 的配方失败
make: *** [ass0] 错误 1
main.c 文件的代码:
#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);
}
汇编代码开始:
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 代码:
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
帮助将是最合适的
由用户解决'tvin' -
尝试将您的原型修改为 extern int strToLeet (char*) asm ("strToLeet"); – 蒂文
我有一个小程序,它由一个汇编函数和一个调用它的 C 函数组成。 现在该程序可以在 UNIX 系统上编译并完美运行,但是在 cygwin 中使用 makefile 时出现以下错误:
gcc -m32 -g -c -o main.o main.c
gcc -g -m32 -o ass0 main.o myasm.o
main.o: 在函数中 main':
/cygdrive/c/ass0/main.c:15: undefined reference to
_strToLeet'
collect2:错误:ld 返回 1 退出状态
makefile:3:目标 'ass0' 的配方失败
make: *** [ass0] 错误 1
main.c 文件的代码:
#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);
}
汇编代码开始:
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 代码:
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
帮助将是最合适的
由用户解决'tvin' - 尝试将您的原型修改为 extern int strToLeet (char*) asm ("strToLeet"); – 蒂文