gcc动态链接库的问题

feifanup 2009-10-07 07:56:04
我想写一个动态链接库,
有2个要求:
1,所有调用到gcc动态库部分的,都要静态编译进来,
因为目标系统上没有这些动态库,比如libstdc++.so等
感觉特想windows上把MFC静态还是动态编译进来一样-..-
2,导出其中的2个函数(传闻linux下面动态库默认导出所有符号)

比如代码是<src.cpp> ,要生成 <mydll.so>

谢谢各位大侠鼎力相助~
...全文
2531 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2009-10-25
  • 打赏
  • 举报
回复
Makefile 改了一下

$ cat Makefile
CXXFLAGS = -fPIC

all: libX.so tcaller

libX.so: tlib.o
$(CXX) -shared -o $@ $^ -Wl,-static -static-libgcc

tcaller: tcaller.o
$(CXX) -o $@ $^ -L. -lX -Wl,-static -static-libgcc

clean:
rm -f tlib.o
rm -f tcaller.o
rm -f libX.so
rm -f tcaller
$ make
g++ -fPIC -c -o tlib.o tlib.cpp
g++ -shared -o libX.so tlib.o -Wl,-static -static-libgcc
g++ -fPIC -c -o tcaller.o tcaller.cpp
g++ -o tcaller tcaller.o -L. -lX -Wl,-static -static-libgcc
/usr/bin/ld: warning: type and size of dynamic symbol `__start___libc_atexit' are not defined
/usr/bin/ld: warning: type and size of dynamic symbol `__stop___libc_atexit' are not defined
$ ldd tcaller
libX.so => ./libX.so (0x2ab00000)
$ ldd libX.so
statically linked
$ ./tcaller
int100
Inconsistency detected by ld.so: dl-fini.c: 180: _dl_fini: Assertion `ns != 0 || i == nloaded' failed!
$
iisbsd 2009-10-22
  • 打赏
  • 举报
回复
编译成.a,静态链接?
feifanup 2009-10-22
  • 打赏
  • 举报
回复
厄,我想我还是需要运行时调用...
mymtom 2009-10-21
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 feifanup 的回复:]
引用 27 楼 feifanup 的回复:
g++ -L. -lX tcaller.o
/usr/bin/ld: a.out: hidden symbol `__preinit_array_start' in a.out is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status


ls的能不能回答一下这个问题...
[/Quote]
这个确实有点怪,不知楼主用的什么系统,我在Linux下试验了楼主的代码,没有问题:

$ cat tlib.h
#ifndef TLIB_H
#define TLIB_H

void f(int x);

#endif /* TLIB_H */
$ cat tlib.c
cat: tlib.c: No such file or directory
$ cat tlib.h
#ifndef TLIB_H
#define TLIB_H

void f(int x);

#endif /* TLIB_H */
$ cat tlib.cpp
#include <iostream>
#include "tlib.h"
#include <string>
using namespace std;

void f(int x)
{
cout << "int" << x << endl;
}

$ cat tcaller.cpp
#include "tlib.h"
#include <stdio.h>

int main()
{
f(100);
return 1;
}
$ cat Makefile
CXXFLAGS = -fPIC

all: libX.so tcaller

libX.so: tlib.o
$(CXX) -shared -o $@ $^ -static -lstdc++ -static-libgcc

tcaller: tcaller.o
$(CXX) -o $@ $^ -L. -lX

clean:
rm -f tlib.o
rm -f tcaller.o
rm -f libX.so
rm -f tcaller
$ make clean && make && ./tcaller
rm -f tlib.o
rm -f tcaller.o
rm -f libX.so
rm -f tcaller
g++ -fPIC -c -o tlib.o tlib.cpp
g++ -shared -o libX.so tlib.o -static -lstdc++ -static-libgcc
g++ -fPIC -c -o tcaller.o tcaller.cpp
g++ -o tcaller tcaller.o -L. -lX
int100
$ uname -a
Linux Loongson-1 2.6.18.1lemote #1 Sat Jan 13 16:02:26 CST 2007 mips GNU/Linux
$
feifanup 2009-10-21
  • 打赏
  • 举报
回复
ls, 你编时用的是:
g++ -shared -o libX.so tlib.o -static -lstdc++ -static-libgcc
我编的时候用的是:
g++ -fpic -Wl,-shared -Wl,-static -lstdc++ -static-libgcc -o libX.so tlib.o

你编出来的.so用ldd查看,还依赖很多gcc系统库哦.
feifanup 2009-10-21
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 iisbsd 的回复:]
该换一下思路,能不能放弃.so?

如果纯静态的话,简单很多。
[/Quote]
因为有好几个模块,无法做到一起.
做的都是动态库,调用者(exe)就一个
你说的纯静态是什么意思?
iisbsd 2009-10-21
  • 打赏
  • 举报
回复
该换一下思路,能不能放弃.so?

如果纯静态的话,简单很多。
feifanup 2009-10-19
  • 打赏
  • 举报
回复
自己顶起
feifanup 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 feifanup 的回复:]
g++ -L. -lX tcaller.o
/usr/bin/ld: a.out: hidden symbol `__preinit_array_start' in a.out is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status

[/Quote]
ls的能不能回答一下这个问题...
mymtom 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 xhd3767 的回复:]
引用 22 楼 mymtom 的回复:
引用 21 楼 xhd3767 的回复:
引用 15 楼 iisbsd 的回复:
g++ -fpic -Wl,-shared -Wl,-static -lstdc++ -static-libgcc -o libX.so tlib.o

请教:-shared和-static能一起使用???为啥??

-shared 指定的是输出文件的格式,-static指定的是输入库的格式。
所以-shared和-static没有直接冲突
但是,在某些平台上-shared需要所有的.o是用-fpic或者-fPIC编译
不能保证所有的.a文件里的.o都用-fpic/-fPIC编译

你好:-Wl,-shared -Wl,-static 都是传给ld的,后面的那个-static才是编译的..
[/Quote]
这个是当然的, gcc/g++ 的-shared 和 -static参数本来就是传给ld的。
俺要说的是,-shared和-static没有直接冲突,但是在某些平台上,由于-fpic/-fPIC参数的原因,
-shared和-static实际上可能是冲突的(比如FreeBSD 7.2 amd64)。
所以ld会报类似下面的错误
/usr/bin/ld: /usr/lib/crt1.o: relocation R_X86_64_32 can not be used when making a shared object; recompile with -fPIC

俺当然也清楚,如果在编译静态库的时候也用了-fPIC参数,或者说由于硬件体系的指令本来就是PIC的,也是能链接成功的(比如在我使用的fedora上 2.6.27.10 内核)
xhd3767 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 mymtom 的回复:]
引用 21 楼 xhd3767 的回复:
引用 15 楼 iisbsd 的回复:
g++ -fpic -Wl,-shared -Wl,-static -lstdc++ -static-libgcc -o libX.so tlib.o

请教:-shared和-static能一起使用???为啥??

-shared 指定的是输出文件的格式,-static指定的是输入库的格式。
所以-shared和-static没有直接冲突
但是,在某些平台上-shared需要所有的.o是用-fpic或者-fPIC编译
不能保证所有的.a文件里的.o都用-fpic/-fPIC编译
[/Quote]
你好:-Wl,-shared -Wl,-static 都是传给ld的,后面的那个-static才是编译的..
feifanup 2009-10-14
  • 打赏
  • 举报
回复
自己顶下
feifanup 2009-10-13
  • 打赏
  • 举报
回复
<tlib.h>
void f(int x);

<tlib.cpp>
#include <iostream>
#include "tlib.h"
#include <string>
using namespace std;

void f(int x)
{
cout << "int" << x << endl;
}

<tcaller.cpp>
#include "tlib.h"
#include <stdio.h>

int main()
{
f(100);
return 1;
}
feifanup 2009-10-13
  • 打赏
  • 举报
回复
g++ -L. -lX tcaller.o
/usr/bin/ld: a.out: hidden symbol `__preinit_array_start' in a.out is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
iisbsd 2009-10-13
  • 打赏
  • 举报
回复
g++ -L. -lX tcaller.o
feifanup 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 feifanup 的回复:]
g++ -L tcaller.o libX.so
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o: In function `_start':
/build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:115: undefined reference to `main'
/usr/bin/ld: a.out: hidden symbol `__preinit_array_start' in a.out is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status

[/Quote]
上面写错了, 是这样的:
我尝试编一个执行文件,调用这个动态库 发生了这个问题
g++ -L. tcaller.o libX.so
/usr/bin/ld: a.out: hidden symbol `__preinit_array_start' in a.out is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
feifan@feifanoffice-desktop:~/Documents/src/testdir$
feifanup 2009-10-13
  • 打赏
  • 举报
回复
g++ -L tcaller.o libX.so
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o: In function `_start':
/build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:115: undefined reference to `main'
/usr/bin/ld: a.out: hidden symbol `__preinit_array_start' in a.out is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
wangqingshui531 2009-10-13
  • 打赏
  • 举报
回复
mark
mymtom 2009-10-11
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 xhd3767 的回复:]
引用 15 楼 iisbsd 的回复:
g++ -fpic -Wl,-shared -Wl,-static -lstdc++ -static-libgcc -o libX.so tlib.o

请教:-shared和-static能一起使用???为啥??
[/Quote]
-shared 指定的是输出文件的格式,-static指定的是输入库的格式。
所以-shared和-static没有直接冲突
但是,在某些平台上-shared需要所有的.o是用-fpic或者-fPIC编译
不能保证所有的.a文件里的.o都用-fpic/-fPIC编译
feifanup 2009-10-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 iisbsd 的回复:]
g++ -fpic -Wl,-shared -Wl,-static -lstdc++ -static-libgcc -o libX.so tlib.o
[/Quote]
谢谢大侠,根据你提供的命令,可以成功的生成一个动态库,
但是在接下来,我测试这个动态库被一个调用者调用的时候,报错了.
g++ -o testdll tcaller.o ./libX.so

厄,能不能再指导一下.具体报错内容我现在无法提供,因为现在没有环境..
如果需要具体的报错来断定,我明天给你提供.
多谢
加载更多回复(19)

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧