我遇到了一個問題:我有2個庫(在NASM中編譯的ASM中的靜態和使用GCC編譯的C中的動態庫)。GCC將包含程序集的靜態庫插入到動態庫中
我首先將一個編譯與下面的Makefile ASM(I去除部分,使其更具有可讀性):
ASM = nasm
NAME = libasmlib.a
SRC = [...all .asm files...]
OBJ = $(SRC:.asm=.o)
FLAGS = -f elf64 -g
all : $(NAME)
$(NAME) : $(OBJ)
ar rc $(NAME) $(OBJ)
ranlib $(NAME)
%.o : %.asm
$(ASM) $(FLAGS) -o [email protected] $<
然後我編譯動態庫,以便它使用靜態的功能:
CC = gcc
NAMEDYN = libclib.so
SRC = [...all .c files...]
OBJ = $(SRC:%.c=%.o)
CFLAGS = -W -Wall -Werror -pedantic -fPIC
LDFLAGS = -L./libs/ASM -lasmlib
$(NAME) : $(OBJ)
$(CC) $(LDFLAGS) -shared -o $(NAMEDYN) $(OBJ)
all : $(NAME)
我沒有問題,一切都完美地編譯,但是當我測試的代碼具有以下.C(與GCC maindyn.c -ldl):
#include <stdio.h>
#include <dlfcn.h>
int main(int ac, char **av)
{
int res;
void *handle;
int (*c_function)(char *str);
if (!(handle = dlopen("./libclib.so", RTLD_LAZY | RTLD_GLOBAL | RTLD_NOW)))
return 1;
c_function = dlsym(handle, "c_function");
res = c_function("Hi!");
printf("%d\n", res);
[...]
}
我得到這個錯誤:在靜態庫
U asm_function
0000000000202078 B __bss_start
0000000000202078 b completed.7558
<snip>
0000000000000ee0 T c_function
0000000000000e20 t register_tm_clones
U [email protected]@GLIBC_2.4
0000000000202078 d __TMC_END__
處:在動態LIB
./a.out: symbol lookup error: ./libclib.so: undefined symbol: asm_function
納米
asm_function.o:
0000000000000000 T asm_function
000000000000001c t _end
0000000000000021 t _finded
0000000000000008 t _loop
你可以在你的'libclib.so '文件並在這裏發佈結果。 –
'U asm_function':'asm_function'被引用但未定義。 –
我的'asm_function'進入了靜態庫。 – DarkyZ