Articles of 共享

为什么链接器修改一个–defsym“绝对地址”

目标:使用可执行文件(不导出符号)的函数的共享库。 意思是: gcc -Wl,–defsym,function=0x432238 手册页指出: "–defsym symbol=expression" Create a global symbol in the output file, containing the absolute address given by expression. 令我沮丧的是, dlopen()将共享库的基地址(这是64位代码) 0x7ffff676f000添加到导出的“绝对符号地址”中: executable shared library ———- linker ————– symbol: 0x432238 =====> 0x7ffff6ba1238 objdump在库中显示正确的符号地址( 0x432238 ),但是一旦用dlopen()加载,符号的地址为0x7ffff6ba1238 。 如果,一旦加载,我手动修补库符号到正确的地址,然后一切正常(否则,库SEGFAULT)。 为什么“绝对地址”被修改? 如何避免它? 更新: 我反驳下面的答复的技术相关性,甚至更多的是“更新”: 让–defsym在PIC库/可执行文件中定义重定位的符号是没有意义的(除了污染没有任何可用function的二进制文件之外,它不起任何作用)。 因此,PIC共享库或PIC可执行文件中唯一相关的–defsym的用法是定义一个( 非重定位的 )“绝对地址”。 顺便说一下,如果你懒得阅读手册页,这就是–defsym的官方目的: “在输出文件中创build一个全局符号,其中包含由expression式给出的absolute address 。” 至多,这是一个Linux链接器deffect这将是微不足道的修复。 对于那些不能等待拒绝人员来实现(并修复)他们的错误的人来说,解决的办法是在二进制映像被不良链接器加载之后修补重定位表。 然后,–defsym在PIC库/可执行文件中变得有用,在我看来这是一个值得欢迎的进展。

将一个静态库链接到共享库?

背景: 我想将几个静态库链接到共享库。 原因是我希望我的应用程序使用我testing过的特定的lib版本。 我不想将静态版本作为共享库发布到我的应用程序中。 我已经创build了这个样本库和应用程序,以尽可能简化。 我想在链接期间继续将共享库链接到应用程序。 题: 为什么我会收到下面列出的错误信息? 我究竟做错了什么? 也许这不是在Linux上做事情的常用方式,但可以这样做吗? 这是提升特定? – – 图书馆 //example.cpp #include <boost/thread.hpp> void doit() { boost::thread t1; } #build script g++ -Wall -fPIC -I/usr/include -c example.cpp -o example.o g++ -shared /usr/lib/libboost_thread.a /usr/lib/libboost_system.a example.o -o libexample.so #build OK. —-示例应用程序 //main.cpp #include <iostream> void doit(); int main() { std::cout << "main\n"; doit(); […]

如何链接在Linux共享库与其他共享库?

我的应用程序dynamic加载liba.so (与dlopen )。 liba.so使用libb.so因此我想将liba.so链接liba.so libb.so 如何在Linux中做到这一点? 提前致谢。

如何在Linux中由两个不同的进程调用共享库文件?

在Linux中,我有一个名为foo.so的共享库文件当我执行2个不同的进程p1,p2,它们都使用foo.so. 这个foo.so是否被这两个过程重叠?

如何列出连接到Linux共享内存段的进程?

如何确定哪个进程连接到共享内存段? awagner@tree:/home/awagner$ ipcs -m —— Shared Memory Segments ——– key shmid owner perms bytes nattch status 0x00000000 0 root 777 102400 1 0x00000000 32769 root 774 96 1 dest 0x00000000 98306 awagner 600 393216 2 dest 0x00000000 131075 awagner 600 393216 2 dest 即我如何确定哪两个进程连接到shmid 98306?

Linux共享库使用共享库的未定义符号

两个共享库liba.so和libb.so. liba.so使用libb.so. 所有的c文件都是用-fPIC编译的。 链接使用共享。 当我们在liba.so上调用dlopen时,它在libb.so中找不到符号…我们得到“未定义符号”错误。 我们可以直接liblo.so没有错误。 我们知道liba正在查找libb,因为我们没有find文件未find的错误。 当我们删除libb.so时,我们得到一个没有find文件的错误。 我们试过了 – 没有运气。 有任何想法吗???? 哦耶。 gcc 4.1.2 更新:在链接liba时使用rpath,因此可以findlibb。 ldd liba.so返回: linux-gate.so.1 => (0xffffe000) libb.so => ./libb.so (0xf6ef9000) <——– LIBB libutil.so.1 => /lib/libutil.so.1 (0xf6ef5000) libdl.so.2 => /lib/libdl.so.2 (0xf6ef1000) libm.so.6 => /lib/libm.so.6 (0xf6ec9000) libpthread.so.0 => /lib/libpthread.so.0 (0xf6eb1000) librt.so.1 => /lib/librt.so.1 (0xf6ea8000) libc.so.6 => /lib/libc.so.6 (0xf6d62000) /lib/ld-linux.so.2 (0x007d0000) 是否有意义的是没有。#在libb的末尾?

ld:在共享库中使用-rpath,$ ORIGIN(recursion)

我刚刚提供了一个在$ORIGIN中使用ld的-rpath选项的基本示例(请参阅第二个响应中的工作版本)。 我试图创build一个例子,其中main.run链接到foo.so ,链接到bar.so ,所有使用rpath和$ORIGIN 。 运行时文件结构是: 项目/ LIB / DIR / 子/ bar.so foo.so 跑/ main.run (未能build立) 我正在build设foo.so使用: g++ -c -o obj/foo.o src/foo.cpp -fPIC g++ -shared -o lib/dir/foo.so obj/foo.o -Wl,-soname,foo.so -Wl,-rpath,'$ORIGIN/sub' -Llib/dir/sub -l:bar.so 哪些build立好。 ldd lib/dir/foo.so甚至可以findbar.so 但是,当我尝试将main.run链接到foo.so , foo.so找不到bar.so. 我正在build设main.so使用: g++ -c -o obj/main.o src/main.cpp g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../lib/dir' -Llib/dir -l:foo.so 这工作正常,如果使用另一个版本的foo.so不recursion链接。 (在make.sh中取消注释行,在下面的项目中进行testing)。 然而,使用正常的foo.so我得到这个错误时,build设main.run […]

有一个相当于-rpath连接器标志的Windows / MSVC?

在Linux / GCC上,我可以使用-rpath标志来更改共享库的可执行文件searchpath,而不用使用环境variables。 这也可以在Windows上完成吗? 据我所知,dll总是在可执行文件的目录和PATH中search。 我的场景:我想根据它们的属性(32 / 64bit / Debug / Release)将共享库放入位置,而不必考虑唯一的名称。 在Linux上,这很容易通过rpath完成,但我还没有find任何方式在Windows上做这个。 感谢任何提示!

如何访问Windows共享上的git回购?

我希望能够将工作回购从我的Windows 7桌面同步到Windows 7笔记本电脑,而无需将我的提交推送到我们的主服务器。 我该怎么做呢? 我无法弄清楚如何设置一个远程path,以便git能够理解它在哪里。 我通常使用Git Bash来处理git,而不是windows命令行,所以这里的问题可能是我无法弄清楚如何在Git Bash中引用一个windows共享的path。 所以,说我有一个回购(Windows共享path): \\\\MyWorkPCName\dev\myrepo\ 而在命令行中,我可以访问目录和文件(尽pipe使用pushd,因为cmd是愚蠢的),我如何将其转换为有效的git远程?

在Windows中查看共享内存的程序?

我正在寻找一个程序来查看和浏览Windows x32 / x64中的(本地)共享内存。 我知道这是存在的,因为我已经看到它在行动之前。 由于某种原因,谷歌和MSDN在这一个失败。