标签: dynamic-linking

removeEventListener 已弃用,我无法正确重构它

Linking.removeEventListener('url', onReceiveURL);

removeEventListener 已弃用。

这是我的 IDE 的建议:

EventEmitter.removeListener('url', ...):方法已被弃用。请改为使用remove()所返回的订阅 EventEmitter.addListener

  // Custom function to subscribe to incoming links
  subscribe(listener: (deeplink: string) => void) {
    // First, you may want to do the default deep link handling
    const onReceiveURL = ({url}: {url: string}) => listener(url);
    // Listen to incoming links from deep linking
    Linking.addEventListener('url', onReceiveURL);
    const handleDynamicLink = (
      dynamicLink: FirebaseDynamicLinksTypes.DynamicLink,
    ) => {
      listener(dynamicLink.url);
    };
    const unsubscribeToDynamicLinks = dynamicLinks().onLink(handleDynamicLink);
    return () => {
      unsubscribeToDynamicLinks();
      Linking.removeEventListener('url', onReceiveURL);
    }; …
Run Code Online (Sandbox Code Playgroud)

refactoring dynamic-linking deprecated deep-linking react-native

19
推荐指数
2
解决办法
1万
查看次数

__libc_start_main发生了什么?

我真的想从高级代码中理解步骤 - >可执行文件......但是我遇到了一些困难.

我写了一个空的int main() {}C文件,并试图解密反汇编objdump -d.这是发生了什么:

  • in _start,设置对齐,在堆栈上推送参数,调用__libc_start_main
  • __libc_start_main,第一行执行是jmp *0x8049658

然而,在使用objdump -R检查出的重定位记录,在价值0x8049658__libc_start_main本身!

我在这里错过了一些东西..

编辑:这是一些来源;

 080482c0 <__libc_start_main@plt>:
 80482c0:       ff 25 58 96 04 08       jmp    *0x8049658
 80482c6:       68 08 00 00 00          push   $0x8
 80482cb:       e9 d0 ff ff ff          jmp    80482a0 <_init+0x2c>

Disassembly of section .text:

080482d0 <_start>:
 80482d0:       31 ed                   xor    %ebp,%ebp
 80482d2:       5e                      pop    %esi
 80482d3:       89 e1                   mov    %esp,%ecx
 80482d5:       83 …
Run Code Online (Sandbox Code Playgroud)

c linux gcc dynamic-linking

18
推荐指数
1
解决办法
1万
查看次数

将GLEW与CMake链接

如何将GLEW链接到CMake项目?

我们一直在尝试使用CMake将GLEW链接到我们的项目至少3个小时而没有任何成功,因此可以接受任何帮助.

我正在使用CMake 3.1.0附带的FindGLEW.cmake

的CMakeLists.txt

find_package(GLEW REQUIRED)
if (GLEW_FOUND)
    include_directories($(GLEW_INCLUDE_DIRS))
endif()
Run Code Online (Sandbox Code Playgroud)

环境变量

在此输入图像描述 在此输入图像描述

我正在使用MinGW w64来编译源代码,我们只是通过将包含和库复制到各自的文件夹来成功链接GLFW和GLM,但在使用GLEW后,CMake仍然无法找到它.

对不起,如果我在制定问题时不够清楚.我将提供所需的任何其他信息.


编辑:我已经设法通过在CMake缓存文件中指定它们的位置链接头文件,虽然我得到未定义的glew函数的引用,如glewInit().

glew cmake dynamic-linking

18
推荐指数
3
解决办法
3万
查看次数

C++ -fvisibility = hidden -fvisibility-inlines-hidden

我有一个关于C++可见性属性的问题.我已经阅读了http://gcc.gnu.org/wiki/Visibility,但我不太明白它是如何工作的.

我希望在我的一些共享库中隐藏可见性.我相信这意味着符号被隐藏了吗?

你打算如何链接共享库呢?有特殊的方式吗?如果我链接它通常如何链接它不起作用.

有谁可以帮助我吗.

c++ linux visibility gnu dynamic-linking

17
推荐指数
2
解决办法
2万
查看次数

c ++ linux双重破坏静态变量.链接符号重叠

环境:linux x64,编译器gcc 4.x

项目有以下结构:

static library "slib"
-- inside this library, there is static object "sobj"

dynamic library "dlib"
-- links statically "slib"

executable "exe":
-- links "slib" statically
-- links "dlib" dynamically
Run Code Online (Sandbox Code Playgroud)

在节目结束时,"sobj"被毁坏两次.这种行为是预期的,但是它在相同的内存地址被破坏了两次,即在析构函数中也是"this" - 因此存在双重破坏问题.我认为这是由于一些符号重叠.

这场冲突的解决方案是什么?也许一些链接选项?


这是测试用例:


main_exe.cpp

#include <cstdlib>

#include "static_lib.h"
#include "dynamic_lib.h"

int main(int argc, char *argv[])
{
    stat_useStatic();
    din_useStatic();
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

static_lib.h

#ifndef STATIC_LIB_H
#define STATIC_LIB_H

#include <cstdio>

void stat_useStatic();
struct CTest
{
    CTest(): status(isAlive)
    {
        printf("CTest() this=%d\n",this);
    }
    ~CTest()
    {
        printf("~CTest() this=%d, %s\n",this,status==isAlive?"is Alive":"is …
Run Code Online (Sandbox Code Playgroud)

c++ linux dynamic-linking static-linking

17
推荐指数
2
解决办法
3538
查看次数

我可以欺骗libc(GLIBC_2.13)加载它没有的符号(来自GLIBC_2.15)吗?

在我尝试将"Steam for Linux"用于Debian时,我遇到了一个问题.libcef(Chromium Embedded Framework)可以正常使用GLIBC_2.13(Debian测试中的eglibc可以提供),但需要一个讨厌的额外函数GLIBC_2.15(eglibc无法提供):

$ readelf -s libcef.so | grep -E "@GLIBC_2\.1[4567]"
1037: 00000000     0 FUNC    GLOBAL DEFAULT  UND __fdelt_chk@GLIBC_2.15 (49)
2733: 00000000     0 FUNC    GLOBAL DEFAULT  UND __fdelt_chk@@GLIBC_2.15
Run Code Online (Sandbox Code Playgroud)

我的攻击计划是LD_PRELOAD一个提供这些功能的垫片库.这似乎不起作用.我真的想避免安装GLIBC_2.17(因为它是在Debian实验中;甚至Debian sid仍然有GLIBC_2.13).


这就是我尝试过的.

fdelt_chk.c基本上是从GNU C库中来的:

#include <sys/select.h>

# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
# define _strong_alias(name, aliasname) \
  extern __typeof (name) aliasname __attribute__ ((alias (#name)));

unsigned long int
__fdelt_chk (unsigned long int d) …
Run Code Online (Sandbox Code Playgroud)

glibc dynamic-linking ld fortify-source

17
推荐指数
2
解决办法
8454
查看次数

在没有线程支持的程序加载的共享库中使用C++ 11多线程

我目前正在尝试在一个共享库中使用C++ 11多线程,该库被加载到Linux上的主程序(用C语言编写)中.这是大型模拟程序的一部分,我无法改变有关库加载或更改主程序的任何内容.

主程序是用gcc 4.1.2编译的,我没有它的源代码(我不能用gcc 4.8.2重新编译它).

共享库使用gcc 4.8.2编译,以便使用C++ 11多线程.我正在传递编译器命令

-pthread -lpthread -std=c++11
Run Code Online (Sandbox Code Playgroud)

正如在Linux下的GCC中使用std :: thread的正确链接选项中所解释的那样

使用此配置(" -pthread -std=c++11"和gcc 4.8)编译独立测试程序在我的系统上正常工作.但是当我启动加载共享库的程序时,我得到一个异常:

Caught std::exception!
Exception Message: Enable multithreading to use std::thread: Operation not permitted

Terminating...
Run Code Online (Sandbox Code Playgroud)

使用-pthread-lpthread(编辑:也只是-pthread没有-lpthread)编译参数不起作用.编译器参数是(我正在使用cook构建系统):

-pthread -std=c++11 -fmessage-length=0 -fPIC -Wchar-subscripts ...(lots of -W* here)
... -Wunused-variable -m64 -D__64BIT__ -pthread -lpthread
Run Code Online (Sandbox Code Playgroud)

和链接器参数(由于构建系统而产生的重复参数):

-pthread -lpthread -std=c++11 -pthread -lpthread -std=c++11 -shared -fPIC -Wl,-Bsymbolic -Wl,--allow-shlib-undefined -pthread -lpthread
Run Code Online (Sandbox Code Playgroud)

在我的库上调用ldd会给出以下输出

$ ldd calc3/build/amd64_linux26_RH5/library.so
    linux-vdso.so.1 => …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading shared-libraries dynamic-linking c++11

17
推荐指数
1
解决办法
4133
查看次数

动态加载和弱符号分辨率

分析这个问题,dlopen在Linux上的动态加载()上下文中发现了一些关于弱符号解析行为的事情.现在我正在寻找管理这个的规范.

我们来举个例子吧.假设有一个程序a可以动态加载库b.so,并c.so按此顺序.如果c.so依赖于另外两个库foo.so(实际上libgcc.so在该示例中)和bar.so(实际上libpthread.so),则通常bar.so可以使用导出的符号来满足弱符号链接foo.so.但是,如果b.so还依赖foo.so但不依赖bar.so,那么这些弱的符号显然不会被联系起来bar.so.看起来好像foo.so墨水只是从ab.so它们的所有依赖项中寻找符号.

这在某种程度上是有道理的,因为否则加载c.so可能会改变已经使用库的foo.so某些点的行为b.so.另一方面,在让我开始的问题中,这引起了相当多的麻烦,所以我想知道是否有办法解决这个问题.为了找到解决方法,我首先需要很好地理解在这些情况下如何指定符号解析的非常精确的细节.

在这些场景中定义正确行为的规范或其他技术文档是什么?

linux dynamic-linking dynamic-loading weak-linking symbol-table

17
推荐指数
1
解决办法
6112
查看次数

为什么有些DLL文件需要额外的.lib文件才能进行链接?

我有关于库链接和.lib文件的问题...

这是背景:

  • OS = Windows
  • IDE = QT

我创建了一个DLL:MyLib.dll.
要在我的QT项目中使用该库,我只需要包含一个包含路径,一个指向库的链接并使用头文件:

LIBS += "C:\myPath\MyLib.dll"
INCLUDEPATH += "C:\myPath"
HEADERS += \
    ../myPath/MyLib_global.h \
    ../myPath/mylib.h
Run Code Online (Sandbox Code Playgroud)

我在我的项目中使用第三方DLL:third.dll
如果我执行与上面示例相同的操作,则它不起作用:

LIBS += "C:\myPath\third.dll" 
Run Code Online (Sandbox Code Playgroud)

第三方DLL附带.lib文件"third.lib",我显然需要与DLL一起使用.

这是为什么?为什么有些DLL库需要.lib文件,但其他DLL库却不需要?
可能是.lib是一个访问DLL的静态库吗?

非常感谢!

dll qt shared-libraries dynamic-linking static-libraries

16
推荐指数
2
解决办法
4785
查看次数

如何创建短路径的符号链接?

我正在编辑某些二进制文件的路径,而不是重新编译它们.

我想/lib/ld-linux-armhf.so.3用一条相同长度的路径来替换我无法创建的路径,这样我就可以在不使用手机的情况下创建.它应该是相同长度的东西,因为我正在编辑二进制文件./data/data/com.clk/.so.3在下面列出的不同可能性之后,我选择了路径.我要做的是创建/data/data/com.clk/.so.3,这应该是一个符号链接/data/data/com.spartacusrex.spartacuside/gentoo_armv6l/lib/ld-linux-armhf.so.3

我最初使用过/proc/5781/cwd/rmhf.so.3,但其他应用程序(其他Linux帐户)无法读取.

然后我尝试了/data/.tmp,但它特定于我的手机,并没有根据@ChrisStratton记录.同样的/data/logcat_log.

/sdcard被排除,因为保险丝选项rw,nosuid,nodev,relatime,user_id=1015,group_id=1015,default_permissions,allow_other限制链接和可执行文件并将/lib/ld-linux-armhf.so.3被执行.

有谁知道我怎么能做到这一点?

android directory-structure binaryfiles dynamic-linking

16
推荐指数
1
解决办法
2699
查看次数