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 […]

发布Windows文件共享锁

这个问题时不时出现在工作中。 我们的生成机器可以通过正常的Windows文件共享访问文件。 如果有人在机器上远程浏览文件夹,并在夜间将窗口打开,则构build失败(如现在所做的那样)。 资源pipe理器窗口左侧打开了源树中的一个子文件夹的点。 构build会删除源代码,并在构build之前进行干净的签出。 删除失败。 现在,我想要构build工作。 我从家里login,我宁愿不重新启动生成机器。 我无法抓住机器正在查找的人和文件,我无法远程重新启动机器。 当一个Windows共享有一个锁,locking过程是系统,所以我不认为我可以杀死它,就像正常的锁。 有谁知道一种方法来释放共享文件夹上的锁而不必重新启动机器?

DLL与不同的会话,服务和用户会话共享内存问题

首先,谢谢你读这:) 我使用DLL共享内存和使用互锁的function。 (赢7) DLL通过服务exe和用户应用程序exe加载。 你知道,服务会话是0,用户会话是1如此不同。 如果DLL的共享内存值由用户应用程序exe改变,则不反映服务的DLL共享内存值。 有没有办法同步服务和用户应用程序的DLL共享内存?

PHP is_dir和mkdir无法在映射的networking驱动器上工作

我已经映射了我的Z:驱动器,指向Windows资源pipe理器中networking上另一台服务器上的文件共享。 我可以在那里访问文件和读/写。 当我尝试从PHP执行mkdir()时,出现“No such file or directory”错误。 作为一个testing,我给每个人读取,写入和执行的权限,但它仍然不起作用。 我正在使用的代码: mkdir('Y:/newfolder/', 0777); 我也试图在PHP中再次映射驱动器无济于事: system('net use Y: "\\DEV01\share" Password1 /user:Administrator /persistent:no>nul 2>&1"); mkdir('Y:/newfolder/', 0777); 请协助。