问题标签 [dladdr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何通过符号在内存中的地址获取有关符号的更多信息
我试图通过它在内存中的地址来获取符号名称。我使用int dladdr(void *addr, Dl_info *info)
函数 fromdlfcn.h
来获取信息:
但此函数找不到与地址匹配的符号,并将 dli_sname 和 saddr 设置为 NULL。
在这种情况下,如何获取符号名称或有关符号的任何其他信息(种类、属性等)?
注意:我要查找的符号名称是_ZTv0_n24_N4QGst13PropertyProbeD0Ev
. QGst::PropertyProbe
它在类的vtable 中列出g++ -fdump-class-hierarchy
:
但是,当我通过和符号查看共享对象并遍历虚函数指针列表dladdr
时,我没有通过它的地址找到它。v-table 中的所有其他函数都由 找到。dlopen
dlsym
_ZTVN4QGst13PropertyProbeE
dladdr
linux - dladdr 不返回 dli_fname 中的完整路径
我使用 dladdr 获取库的完整路径:
它工作正常。但是,如果我用构建重命名文件夹(然后再次运行),dli_fname 不包含完整路径,只包含库的文件名。这是为什么?
除了重命名构建文件夹之外还有其他步骤(杂项。cmake 更改,主要与安装功能相关),但问题仅在重命名后出现(即应用程序不是从构建文件夹运行)。
c - glibc - 获取具有包含指定地址的符号的共享库的句柄
像 dladdr 这样的东西给了我一个共享对象的动态库句柄,或者一种从共享对象的基地址获取句柄的方法。包含共享对象的文件可能已被移动或删除,所以不,我不能 dlopen() dladdr 给出的文件名。
ios - 获取所有原生类的列表
我想获取已加载到我的 iOS 项目中的所有本机类(NSString、NSNumber、int、float、NSSet、NSDictionary)。
即,如果我创建了一个名为“TestClass”的自定义类,我不希望它列出......
我已经有一个代码,但它返回加载的所有类的名称我可以修改代码以将列表限制为仅本地类?
c++ - 剂量 dladdr 能够从静态成员获取信息吗?
在研究一些图书馆时,我发现了这种代码
存在此代码的类中dirSep
的static const char*
成员在哪里(在成员函数中),所以我的问题是:是否有任何地方记录了该dladdr
函数能够获取信息表单static const member
字段?
c++ - 为什么 dladdr 在 arm-linux 上的位置无关代码上返回可执行文件的路径?
在我使用 Emdebian 的 armhf 的 g++-4.7 交叉编译器为 arm-linux 交叉编译的一些代码中,我一直遇到 dladdr 的问题。问题似乎是,如果您传递给 dladdr 的函数指针是在可执行文件中调用的函数,则 dli_fname 将返回可执行文件的路径,而不是符号来自的共享库。
通过以下方式编译的示例:
/usr/bin/arm-linux-gnueabihf-g++-4.7 main.cpp -o main -ldl -fPIC
结果: printf 来自 ./main
如果我将 main() 的主体更改为
结果:printf 来自 /lib/arm-linux-gnueabihf/libc.so.6
我注意到,如果您传递给 dladdr 的函数指针的函数在可执行文件中被调用,则沿行的条目
是在可执行文件的 .rel.plt 部分中创建的,看起来 dladdr 是从 PLT 中找到 printf 的这个地址,而不是从 libc.so.6 中找到的正确地址,它会通过 GOT 找到。dladdr手册页建议将代码编译为位置独立应该可以解决此问题,但此编译器似乎并非如此。作为参考,上面显示的相同代码在带有 g++-4.7 的 x86_64 Linux 上按预期工作。
c - C中运行时的变量名,函数参数
是否可以在 C 程序运行时知道函数参数和变量的名称类型?例如,如果我有一个功能:
我能知道在这个函数内部abc()
,参数和变量的名称是什么,即在这种情况下它的x
, y
, z
, a
,b
它们的类型是int
, float
, somestruct
, char
, int
。
说如果有另一个功能:
我应该知道参数名称是my_struct
,index
类型是specialstruct
, int
。
我在运行时需要这些信息吗?
我可以访问基指针和返回地址,我可以使用上面的指针获取所需的信息。
我能够使用返回地址和dladdr()
函数来提取函数名。
我看到GDB
了,所以应该可以提取此信息?
c++ - C++ 函数地址——使用 dladdr 和 backtrace()
我想使用 backtrace() 并获取函数地址以进行跟踪。我想在运行时存储来自 backtrace() 的函数地址,并在以后使用它进行分析(例如,使用 dladdr() 加载回函数名称、查看调用统计信息等)。这样做时,我试图查看类成员函数的静态地址。
Alib.so,啊:
A.cpp
主文件
这输出:
如果我多次重新运行 main,它会给我相同的地址。如果我将 main.cpp 更改为此:
每次我运行 main 可执行文件时,输出都是不同的,即使没有重新编译 .so 或 main:
我检查这个的原因是我想使用 backtrace() 来获取当前堆栈函数的函数信息(地址)以进行跟踪,它的作用非常相似。我尝试在 .so 库函数中调用 backtrace(),并在当前堆栈函数上使用 backtrace() 和 dladdr() 获取函数的符号信息。在 .so 中打印函数地址与在 main 中执行它会给出不同的地址。如何使用 dladdr() 的函数地址来获取信息,例如符号名称?
在 .so 和 main() 中映射的类成员函数地址有什么不同吗?
编辑:重新措辞并提供更多代码示例来解释问题。
c++ - 可执行文件中定义的函数的名称(使用 dladdr)
我有一个程序(一个应用程序,而不是共享库):
我希望 functionName 是“func”——我从中调用 unw_get_proc_name() 的函数的名称。但是 unw_get_proc_name() 失败了。我调试了它,发现它使用函数 dladdr() 来获取函数的名称:
由于某种原因,dyldInfo.dli_sname 为 0。为什么?我怎样才能解决这个问题?
我还使用了共享库中的函数 unw_get_proc_name() ,在这种情况下它成功了。所以问题是为什么在从应用程序(不是共享库)调用时检索函数名(上面程序中的“func”)失败?我该如何解决?
我尝试将属性 __attribute__((noinline)) 和 __attribute__(( visibility ("default"))) 添加到我的 func() 函数中,但它没有帮助。
c++ - 在 Linux 上,在 C++ 程序中,如何找到已加载的共享库的路径?
我需要从没有很多常用工具(例如,没有 ldd、没有 gdb 等)的嵌入式平台上的自定义库中加载函数。我正在交叉编译到那个平台。
假设我想foo
使用libx.so
. 现在该平台已libx.so
包含在系统库目录中,但我希望我的程序从另一个位置获取它。我已经相应地设置了 LD_LIBRARY_PATH,但我强烈怀疑我的程序仍在使用系统之一。
我尝试了以下方法:
但这会返回a.out
,这是没有帮助的。
我也试过:
我得到一个空字符串。请注意,返回码不是0。
我可以尝试其他任何方法吗?
谢谢。