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

在两个进程(C,Windows)之间共享内存

由于我没有find一个问题的答案在这里以前问我在尝试一种不同的方法。 有什么办法可以在两个进程之间共享内存? 第二个进程从注入获取信息,因为这是一个传统程序,它不再被支持。 我的想法是在那里注入一些代码,在我传递给注入的程序的结构中,将地址(或其他)传递给共享内存,我需要运行的数据位于该共享内存中。 一旦我得到的数据,我将在注入的线程中填充我自己的variables。 这可能吗? 怎么样? 代码表示赞赏。 编辑: 我认为这不清楚,所以我会澄清。 我知道如何注入。 我已经在做了。 这里的问题是将dynamic数据传递给注入。

在Windows和Silverlight类库之间共享C#代码

我们编写了一个小的Windows类库,为一些标准types(string最初)实现了扩展方法。 我把它放在一个库中,以便我们的任何项目都可以通过简单地引用它并添加使用XXX.Extensions来使用它。 当我们想在Silverlight中使用这些方法时出现了一个问题。 尽pipe所有的代码都是兼容的,但Silverlight中不能引用Windows库,所以我们创build了一个Silverlight库,它链接到相同的类文件,并将编译器指令放入类中,以允许使用不同的声明和名称空间。 这工作得很好,直到今天,当我添加一个新的类到Windows扩展库,并意识到我将不得不记得将类连接到Silverlight库。 这是不理想的,我想知道是否有人有更好的方式共享Windows和Silverlight项目之间的扩展方法和其他帮助代码的想法。

Windows文件共享:为什么有时新创build的文件在一段时间内不可见?

我们面对非常奇怪的问题,使我们疯了。 有时我们的文件共享PC上新创build的文件在一段时间内“缺席”。 重现一个问题,你至less应该有两台电脑,称之为alpha和beta 。 在beta PC上创build文件共享( \\beta\share\bug )并从alpha PC运行这个PowerShell脚本: param( $sharePath="\\beta\share\bug" ) $sharePC = ($sharePath -split '\\')[2] $session = New-PSSession -ComputerName $sharePC $counter = 0 while ($true) { $fileName = $sharePath + "\$counter.txt" Invoke-Command -Session $session -ScriptBlock { param( $fileName ) "" > $fileName } -ArgumentList $fileName if (Test-Path $fileName) { Write-Host "File $fileName exists" […]