Chinaunix
标题:
编译源码执行没问题,源码编译成动态库加载执行内存出错
[打印本页]
作者:
沉水之鱼
时间:
2019-05-15 11:29
标题:
编译源码执行没问题,源码编译成动态库加载执行内存出错
本帖最后由 沉水之鱼 于 2019-05-15 11:39 编辑
RT, 目前对外交付一个项目,因为一些核心源码不能对外开放,将对应的源码编译成.so进行链接,传进去的多级指针出现了如下问题:
1. 用源码编译执行的时候,传入这段函数之前和传入之后的多级指针打印地址相同,没有问题, 程序能正确执行。
2. 用源码编译的.so链接后,传入这段函数之前和传入之后的多级指针打印地址不一样,程序不能正确执行。
相关makefile如下
copybase:= cp $(CURDIR)/libbase/libbase.so $(bin_dir)/libs/
define compile_libbase
$(CR_CC) -c $(CURDIR)/libbase/lib_base.c -o $(bin_dir)/$(EXE)/lib$@/lib_base.o $(LOCAL_CFLAGS)
$(CR_CC) -shared -o $(bin_dir)/$(EXE)/libbase.so $(bin_dir)/$(EXE)/lib$@/*.o
endef
$(EXE): clean checkdir base
$(Q) echo "DONE"
base:
mkdir -p $(bin_dir)/$(EXE)/lib$@
ifeq ($(CURDIR)/libbase/lib_base.c, $(wildcard $(CURDIR)/libbase/lib_base.c))
$(call compile_libbase)
else
$(copybase)
endif
echo "DONE LIBBASE"
复制代码
有没有大神遇到这种情况?
作者:
mymbsd
时间:
2019-11-04 09:28
如果使用GCC, 在定义全局变量的时候如果不小心,使用动态链接库的时候确实会出现奇怪的现象
$ cat main.c
#include <stdio.h>
void foo();
void bar();
int
main(int argc, char *argv[])
{
foo();
bar();
return 0;
}
$ cat foo.c
#include <stdio.h>
int x;
int y = 2;
void
foo(void)
{
printf("x=%d,y=%d\n", x, y);
}
$ cat bar.c
#include <stdio.h>
int x = 1;
int y;
void
bar(void)
{
printf("x=%d,y=%d\n", x, y);
}
$ make
cc -c -o main.o main.c
cc -c -o foo.o foo.c
cc -c -o bar.o bar.c
cc -o demo1 main.o foo.o bar.o
cc -o demo2 main.o -L. -lfoo -lbar
cc -o demo3 main.o -L. -lbar -lfoo
$ ./demo1; ./demo2; ./demo3
x=1,y=2
x=1,y=2
x=0,y=2
x=0,y=2
x=1,y=0
x=1,y=0
$
复制代码
作者:
mymbsd
时间:
2019-11-04 09:29
回复
2#
mymbsd
希望对楼主有用
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2