沉水之鱼 发表于 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

希望对楼主有用
页: [1]
查看完整版本: 编译源码执行没问题,源码编译成动态库加载执行内存出错