什么是基于unix的系统中的延迟负载等价物.
我有一个代码foo.cpp,在用gcc编译时,我将它链接到共享对象(共有三个.so文件.).每个.so文件都有不同的选项.
./foo -v需要libversion.so
./foo -update需求libupdate.so
我需要这些库的符号只能在运行时解析.
./foo -v 即使libupdate.so库不存在也不应该破坏.
它在Windows中使用延迟加载选项(在dll的属性中).在Unix系统中它的等价物是什么.
威尔-lazy选项确实在UNIX一样吗?如果是这样,在哪里包含此选项:在makefile中还是在链接器ld中?
在运行时,我需要打印一个地址,然后找到该地址所属的功能.这些函数位于共享库中,因此不在固定地址.我的地图文件显然只显示每个共享库func的相对偏移量.是否有可能在运行时查询已加载库的位置,以便我可以从我的地址中减去该值以获得正确的映射文件偏移量?
目前我正在做一个有点hacky的approch,我也打印出库中一个函数的地址,然后在map文件中找到该函数来确定加载地址必须在哪里.我宁愿有一个通用的方法,不要求你命名一个引用函数.
(GDB在我的设置中不可用).谢谢.
目标:使用可执行文件中的函数(不导出符号)的共享库.
手段: gcc -Wl,--defsym,function=0x432238
该手册页指出:
"--defsym symbol=expression" Create a global symbol in the output
file, containing the absolute address given by expression.
Run Code Online (Sandbox Code Playgroud)
令我沮丧的dlopen()是0x7ffff676f000,将共享库的基地址(这是64位代码)添加到导出的"绝对符号地址":
executable shared library
---------- linker --------------
symbol: 0x432238 =====> 0x7ffff6ba1238
Run Code Online (Sandbox Code Playgroud)
objdump 0x432238在库中显示正确的符号地址(),但一旦加载dlopen(),符号就有地址0x7ffff6ba1238.
如果,一旦加载,我手动将库符号修补到正确的地址,然后一切正常(否则,库SEGFAULTs).
更新:
我对以下答复的技术相关性提出质疑,并且更多的是"更新":
使用--defsym在PIC库/可执行文件中定义重定位符号是没有意义的(除了在没有任何可用功能的情况下污染二进制文件之外,它不起任何作用).
因此,PIC共享库或PIC可执行文件中--defsym的唯一相关用法应该是定义(非重定位)"绝对地址".
顺便说一句,如果您懒得阅读手册页,这是--defsym的官方目的:
"在输出文件中创建一个全局符号,其中包含absolute address给定的表达式."
充其量,这是一个Linux链接器的影响,这将是微不足道的修复.对于那些不能等待拒绝人员实现(并修复)他们的错误的人来说,解决方案是在缺陷链接器加载二进制映像之后修补重定位表.
然后,-defsym在PIC库/可执行文件中变得很有用,在我看来这是一个值得欢迎的进展.
我希望让我的Perl程序使用多个核心.它逐步读取查询输入,并将其中的块与每个运行的从文件加载的只读数据结构进行比较.该数据结构通常是几千兆字节,是一小组压缩字符串,用于小型C例程.当进程被分叉时,所有内容都被复制,这在多核计算机上快速打开RAM.我尝试了几个非标准模块,但都会导致速度变慢和/或破坏RAM.我认为,对于只读数据,Perl不会坚持要复制.其他语言可以做到.有人有想法吗?
我开发了一个使用共享内存的Windows应用程序---即内存映射文件,用于进程间通信.我有一个Windows服务,它执行一些处理并定期将数据写入内存映射文件.我有一个单独的Windows应用程序,它从内存映射文件中读取并显示信息.该应用程序在Windows XP,XP Pro和Server 2003上按预期工作,但不在Vista上.
我可以看到写入内存映射文件的数据是由Windows服务正确发生的,因为我可以使用文本编辑器打开文件并查看存储的消息,但"消费者"应用程序无法从文件中读取.这里需要注意的一件有趣的事情是,如果我关闭使用者应用程序并重新启动它,它会消耗先前写入内存映射文件的消息.
另外,另一个奇怪的事情是当我使用远程桌面连接到Windows主机并通过远程桌面调用/使用消费者应用程序时,我得到相同的行为.但是,如果我调用远程桌面并使用以下命令连接到目标主机的控制台会话:mstsc -v:servername /F -console,一切正常.
这就是为什么我认为问题与权限有关.任何人都可以评论这个吗?
编辑:
我用来创建内存映射文件的ACL和同步访问的Mutex对象如下:
TCHAR * szSD = TEXT("D:")
TEXT("(A;;RPWPCCDCLCSWRCWDWOGAFA;;;S-1-1-0)")
TEXT("(A;;GA;;;BG)")
TEXT("(A;;GA;;;AN)")
TEXT("(A;;GA;;;AU)")
TEXT("(A;;GA;;;LS)")
TEXT("(A;;GA;;;RD)")
TEXT("(A;;GA;;;WD)")
TEXT("(A;;GA;;;BA)");
Run Code Online (Sandbox Code Playgroud)
我认为这可能是问题的一部分.
有没有办法在可以安装Ruby的共享主机上部署本地制作的rails应用程序?
这两个应用程序具有相同的sharedUserId.当我在app1中使用此代码时
context.openFileOutput("/data/data/org.me.app2/files/shared-data.dat", MODE_PRIVATE)
Run Code Online (Sandbox Code Playgroud)
我得到一个异常,告诉我该文件包含一个路径分隔符.
我正在尝试将app1中的文件写入app2的存储空间.(我当然需要确保app2的文件目录首先存在)
理想情况下,我会写一个用户特定的目录而不是特定于应用程序的目录,但我不知道是否可以这样做
我在服务器上创建了一个Git repo,并希望它被几个人使用,即属于同一个Unix组的用户.它还有一个工作副本,因为我们可能有一个共同的工作副本.
因此,我将该Git repo目录的拥有组设置为该Unix组.
问题是,每当有人推送到该存储库时,新文件/目录都将所有者设置为该用户及其组的用户名,而不是我们的公共组.此外,所有这些新文件/目录成为rwxr-xr-x.
我尝试过,git config core.sharedRepository group但这不起作用.它现在使文件/目录成为rwxrwsr-x但仍然是错误的组集.
可以从另一个共享库中共享库加载和调用函数吗?
我有共享库libDsmTestLib.so,它使用另一个共享库libDsmShared.so和libPINDsmShared.so
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := DsmTestLib
LOCAL_SRC_FILES := DSM_Library.cpp
LOCAL_LDLIBS := -lDsmShared
LOCAL_LDLIBS += -lPINDsmShared
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
当我创建libDsmTestLib.so并想在我的android java应用程序中使用它时,如下所示:
package com.dsm;
import android.app.Activity;
import android.os.Bundle;
public class dsmTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
static {
try {
System.loadLibrary("DsmTestLib");
}
catch( UnsatisfiedLinkError e ) {
System.err.println("Native code library failed to load.\n" + e);
} …Run Code Online (Sandbox Code Playgroud) 关于共享内存和分布式内存之间的区别,我有点困惑.你能澄清一下吗?
是一个处理器的共享内存和许多(网络)分布?
如果我们有共享内存,为什么我们需要分布式内存?