当前位置: 技术问答>linux和unix
小弟写了一个很简单的动态库实例函数用来学习,但编译通过之后执行可执行文件报错。跪请高手帮忙!!!!
来源: 互联网 发布时间:2015-09-28
本文导语: 环境: AIX 5L 主函数 ren.c 使用 test.c temp.c 这两个api生成动态库 libtest.so 供主函数调用 编译通过但执行可执行文件时报如下错: exec(): 0509-036 Cannot load program ren because of the following errors: 0509-151 ...
环境: AIX 5L
主函数 ren.c
使用 test.c temp.c 这两个api生成动态库 libtest.so 供主函数调用
编译通过但执行可执行文件时报如下错:
exec(): 0509-036 Cannot load program ren because of the following errors:
0509-151 The program does not have an entry point or
the o_snentry field in the auxiliary header is invalid.
0509-194 Examine file headers with the 'dump -ohv' command.
小弟不知所措 但在命令行中使用 cc 编译 却至少能够执行主函数中开始的printf语句
忘各位老师高手 多多帮忙!!! 小弟不胜感激
原码如下:
ren.c
#include
#include
#define MAXLEN 8192
int
main()
{
int ilRc;
char name[MAXLEN];
char para[MAXLEN];
FILE *fp;
int (*func)();
void *Handle;
printf("input funcname!!n");
scanf("%s",name);
printf("funcname is [%s]n",name);
printf("input funcpara!!n");
scanf("%s",para);
printf("funcpara is [%s]n",para);
if((fp = fopen("/home/switch/ramon/debug/main.debug","w")) == NULL)
{
printf("create debug file failed!!n");
exit(-1);
}
Handle = dlopen("/home/switch/ramon/lib/libtest.so",RTLD_LAZY);
if(Handle == NULL)
{
fprintf(fp,"dlopen libtest.so failed!!n");
exit(-1);
}
func = (int(*)())dlsym(Handle,name);
if(func == NULL){
fprintf(fp,"dlsym [%s] failed!!n",name);
exit(-1);
}
ilRc = func(para);
if(ilRc != 0){
fprintf(fp,"func [%s] failed!!n",para);
exit(-1);
}
dlclose(Handle);
fprintf(fp,"opretion success!!n");
fclose(fp);
}
temp.c:
#include
int
temp(char *temp)
{
printf("this is function temp!!n");
printf("the string is [%s]!!n",temp);
}
test.c :
#include
int
test(char *test)
{
printf("this is function test!!n");
printf("the string is [%s]!!n",test);
}
makefile:
INCLUDE= -I$(HOME)/ramon/include
LIBSO= -L$(HOME)/ramon/lib -ltest
BIN= $(HOME)/ramon/bin
LIB= $(HOME)/ramon/lib
CC=cc
CCFLAG= -g -c
.SUFFIXES: .c .o
all: libtest ren clean
.c.o:
$(CC) $(CCFLAG) -o $*.o $*.c
ren:ren.o
@echo Building "ren..."
$(CC) -G -o $(BIN)/ren ren.o $(LIBSO) -lc -lm
libtest:test.o temp.o
@echo ----Making dllLibraries-------
$(CC) -G -o libtest.so test.o temp.o -bE:libtest.exp -bM:SRE -bnoentry -lc
mv libtest.so $(LIB)/libtest.so
clean:
rm -f *.o
libtest.exp:
*
*******************************************
* local service functions
*******************************************
*
#!libtest.o
test
temp
*
*******************************************
* end define
*******************************************
*
多谢多谢了 高人解决 小弟另开贴散分 跪地叩首!!!!
主函数 ren.c
使用 test.c temp.c 这两个api生成动态库 libtest.so 供主函数调用
编译通过但执行可执行文件时报如下错:
exec(): 0509-036 Cannot load program ren because of the following errors:
0509-151 The program does not have an entry point or
the o_snentry field in the auxiliary header is invalid.
0509-194 Examine file headers with the 'dump -ohv' command.
小弟不知所措 但在命令行中使用 cc 编译 却至少能够执行主函数中开始的printf语句
忘各位老师高手 多多帮忙!!! 小弟不胜感激
原码如下:
ren.c
#include
#include
#define MAXLEN 8192
int
main()
{
int ilRc;
char name[MAXLEN];
char para[MAXLEN];
FILE *fp;
int (*func)();
void *Handle;
printf("input funcname!!n");
scanf("%s",name);
printf("funcname is [%s]n",name);
printf("input funcpara!!n");
scanf("%s",para);
printf("funcpara is [%s]n",para);
if((fp = fopen("/home/switch/ramon/debug/main.debug","w")) == NULL)
{
printf("create debug file failed!!n");
exit(-1);
}
Handle = dlopen("/home/switch/ramon/lib/libtest.so",RTLD_LAZY);
if(Handle == NULL)
{
fprintf(fp,"dlopen libtest.so failed!!n");
exit(-1);
}
func = (int(*)())dlsym(Handle,name);
if(func == NULL){
fprintf(fp,"dlsym [%s] failed!!n",name);
exit(-1);
}
ilRc = func(para);
if(ilRc != 0){
fprintf(fp,"func [%s] failed!!n",para);
exit(-1);
}
dlclose(Handle);
fprintf(fp,"opretion success!!n");
fclose(fp);
}
temp.c:
#include
int
temp(char *temp)
{
printf("this is function temp!!n");
printf("the string is [%s]!!n",temp);
}
test.c :
#include
int
test(char *test)
{
printf("this is function test!!n");
printf("the string is [%s]!!n",test);
}
makefile:
INCLUDE= -I$(HOME)/ramon/include
LIBSO= -L$(HOME)/ramon/lib -ltest
BIN= $(HOME)/ramon/bin
LIB= $(HOME)/ramon/lib
CC=cc
CCFLAG= -g -c
.SUFFIXES: .c .o
all: libtest ren clean
.c.o:
$(CC) $(CCFLAG) -o $*.o $*.c
ren:ren.o
@echo Building "ren..."
$(CC) -G -o $(BIN)/ren ren.o $(LIBSO) -lc -lm
libtest:test.o temp.o
@echo ----Making dllLibraries-------
$(CC) -G -o libtest.so test.o temp.o -bE:libtest.exp -bM:SRE -bnoentry -lc
mv libtest.so $(LIB)/libtest.so
clean:
rm -f *.o
libtest.exp:
*
*******************************************
* local service functions
*******************************************
*
#!libtest.o
test
temp
*
*******************************************
* end define
*******************************************
*
多谢多谢了 高人解决 小弟另开贴散分 跪地叩首!!!!
|
好像你在生成temp.o,test.o的时候不对
gcc -fPIC -g -c test.c -o test.o
gcc -fPIC -g -c temp.c -o temp.o
我没用你的makefile自己编译了一下
可以运行
另外ilRc=func(name)需要函数返回值
你的test,temp函数都没有返回值
gcc -fPIC -g -c test.c -o test.o
gcc -fPIC -g -c temp.c -o temp.o
我没用你的makefile自己编译了一下
可以运行
另外ilRc=func(name)需要函数返回值
你的test,temp函数都没有返回值
|
我是这样调用
ren.c
#include
#include
void* slib=0;
int (*test) ();
int (*temp) ();
main()
{
slib=dlopen("libmongate.so",RTLD_LAZY);
hError=dlerror();
if (hError)
{
printf("dlopen Error!n");
return;
}
test=dlsym(slib,"test");
temp=dlsym(slib,"temp");
hError=dlerror();
if (hError)
{
printf("dlopen Error!n");
return;
}
test();
temp();
dlclose(slib);
if (hError)
{
printf("dlclose Error!n");
return;
}
}
ren.c
#include
#include
void* slib=0;
int (*test) ();
int (*temp) ();
main()
{
slib=dlopen("libmongate.so",RTLD_LAZY);
hError=dlerror();
if (hError)
{
printf("dlopen Error!n");
return;
}
test=dlsym(slib,"test");
temp=dlsym(slib,"temp");
hError=dlerror();
if (hError)
{
printf("dlopen Error!n");
return;
}
test();
temp();
dlclose(slib);
if (hError)
{
printf("dlclose Error!n");
return;
}
}
|
ren.c的main()前加二行
int (*test) ();
int (*temp) ();
int (*test) ();
int (*temp) ();
|
恕我冒昧
难道不需要加
-shared
难道不需要加
-shared