首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏一个程序员的修炼之路

    链接选项rpath,容易被忽略的一个功能

    利用rpath这个链接选项! +++++++++++ -rpath dir Add a directory to the runtime library search path. 链接选项主要有两个功能: (1)程序运行时,优先到rpath指定的目录去寻找依赖库 (2)程序链接时,在指定的目录中,隐式的链接那些动态库所需要的链接库。 我们将liba.so,libb.so 和 libc.so拷贝的同一个目录中,然后利用rpath链接应用程序,这样编译便不需要显示的去链接liba.so所依赖的库了。 -la -Wl,-rpath=. +++++++++++++++++++++++++++++++++++++++++++++

    1.1K20发布于 2021-08-06
  • 来自专栏24K纯开源

    MacOS平台下@rpath在动态链接库中的应用

    后来在使用到CUDA库时,偶然发现了@rpath这个东西在CUDA动态库中被广泛使用。于是就好好研究了下@rpath的一些应用场景。 ? (3) @rpath。这个就是今天要介绍的重点,它是run path的缩写。本质上它不是一个明确的path,甚至可以说它不是一个path。它只是一个变量,或者叫占位符。 这个变量通过XCode中的run path选项设置值,或者通过install_name_tool的-add_rpath设置值。设置好run path之后,所有的@rpath都会被替换掉。 [-rpath old new] ... [-add_rpath new] ... [-delete_rpath old] ... [-id name] input (3)从比较@executable_path, @loader_path, @rpath来看,@rpath是最具灵活性的,也是Apple官方最推崇的方式。

    4.9K100发布于 2018-01-18
  • 来自专栏编程语言

    iOS 13.3.1 真机 CocoaPods 三方库奔溃问题 dyld: Library not loaded: @rpath

    问题表现形式: 1.dyld: Library not loaded: @rpath 2.当你解决掉这个引用问题,会发现在真机上面会奔溃在你引用三方的地方 问题出现系统版本:13.3.1 真机 解决方案

    1.8K20发布于 2020-02-24
  • 来自专栏全栈程序员必看

    linux下的so、o、lo、a、la文件的区别

    所有由’-rpath-link’选项指定的搜索路径. 2. 所有由’-rpath’指定的搜索路径. ‘-rpath’跟’-rpath_link’的不同之处在于,由’-rpath’指定的路径被包含在可执行文件中,并在运行时使用, 而’-rpath-link’选项仅仅在连接时起作用. 3. 但在交叉编译下,上述八种策略,可以使用的仅仅有两个:-rpath-link,-rpath。 通过上面的描述可以看到:-rpath指定的路径将被写到可执行文件中;-rpath-link则不会;我们当然不希望交叉编译情况下使用的路径信息被写进最终的可执行文件,所以我们选择使用选项-rpath-link gcc的选项“-Wl,–rpath-link –Wl,DIR”会把-rpath-link选项及路径信息传递给链接器。

    10.1K30编辑于 2022-07-20
  • 来自专栏二进制漏洞研究

    Libc Realpath缓冲区下溢漏洞分析

    __getcwd (rpath, path_max)) { rpath[0] = '\0'; goto error; } dest = __rawmemchr (rpath, '\0'); } else { rpath[0] = '/'; dest = rpath + 1; } 如果getcwd此时返回的是”(unreachable 通过readlink获取新的rpath: ? 将name的值变成预先设好的字符串,包含”..” ? 执行到漏洞点,此时rpath为”(unreachable)/tmp/down”,dest为”down”,name为”0x7fffe41fac70 “.. = rpath) && (*--dest != '/')); + if ((dest == rpath) && (*dest !

    1.7K20发布于 2019-02-27
  • 来自专栏全栈程序员必看

    编译命令行终端 swift

    lots of copying/install_name_tool calls to sort it out... $ otool -l test |fgrep path name @rpath /libswiftAppKit.dylib (offset 24) name @rpath/libswiftCoreGraphics.dylib (offset 24) name @rpath/libswiftDarwin.dylib (offset 24) name @rpath/libswiftDispatch.dylib (offset 24) name @rpath/libswiftFoundation.dylib (offset 24) name @rpath/libswiftObjectiveC.dylib (offset 24) name @rpath/libswift_stdlib_core.dylib (offset 24) path /Applications/

    1.2K10编辑于 2022-07-06
  • 来自专栏我的技术专刊

    动态库详解

    定义(下方有做说明) -> 修改路径 -> install_name_tool -id @rpath/Framework/TestExample.framework/TestExample @rpath -> 由可执行文件的MachO提供 去查看可执行文件中是否有@rpath -> otool -l test | grep 'RPATH' -A 5 -> 发现没有 注意此处大小写敏感 在可执行文件中添加 @rpath -> install_name_tool -add_rpath <路径> <添加的可执行文件> otool -l test | grep 'dylib' -A 3 -i 如果想大小写不敏感 -> 拼上-i的参数 添加后可直接运行查看 -> lldb -file test -> r -> q 修改可执行文件的rpath路径 -> install_name_tool -rpath <旧路径> 键值对来加深印象 install_name 与 @rpath @rpath -> Runpath search Paths -> dylb搜索路径 -> 谁链接动态库, 就由谁来提供@rpath '@

    1.2K20编辑于 2021-12-06
  • 来自专栏花落的技术专栏

    动态库

    定义(下方有做说明) -> 修改路径 -> install_name_tool -id @rpath/Framework/TestExample.framework/TestExample @rpath -> 由可执行文件的MachO提供 去查看可执行文件中是否有@rpath -> otool -l test | grep 'RPATH' -A 5 -> 发现没有 注意此处大小写敏感 在可执行文件中添加 @rpath -> install_name_tool -add_rpath <路径> <添加的可执行文件> otool -l test | grep 'dylib' -A 3 -i 如果想大小写不敏感 -> 拼上-i的参数 添加后可直接运行查看 -> lldb -file test -> r -> q 修改可执行文件的rpath路径 -> install_name_tool -rpath <旧路径> 键值对来加深印象 install_name 与 @rpath @rpath -> Runpath search Paths -> dylb搜索路径 -> 谁链接动态库, 就由谁来提供@rpath '@

    1.4K30编辑于 2021-11-26
  • 来自专栏小徐学爬虫

    Python脚本处理unicode字符时的解决方法

    scandirs(currentFile) if os.path.splitext(currentFile)[1] == ".flac": rpath = os.path.relpath(currentFile) print "**DEBUG** rpath =", rpath title = os.path.basename album = fpath[1] print "**DEBUG** album =", album out = "%s | %s | %s | %s\n" % (rpath scandirs(currentFile) File "decflac.py", line 20, in scandirs out = "%s | %s | %s | %s\n" % (rpath = os.path.relpath(currentFile) print "**DEBUG** rpath =", rpath title = os.path.basename

    57610编辑于 2024-03-12
  • 来自专栏安恒网络空间安全讲武堂

    翻译 | Linux利用动态链接共享对象库提权

    Linux利用动态链接共享对象库提权 RPATH和弱文件权限会导致系统的损害。 运行使用共享库的应用程序时,操作系统按以下顺序搜索库(来自https://linux.die.net/man/1/ld): 任何由rpath-link选项指定的目录(由rpath-link选项指定的目录仅在链接时有效 ) 任何由rpath选项指定的目录(rpath选项指定的目录都包含在可执行文件中,并在运行时使用) LD_RUN_PATH LD_LIBRARY_PATH DT_RUNPATH或DT_RPATH中的目录 示例: 我将演示一个示例,其中使用RPATH编译的二进制文件结合弱文件权限可以导致获得root权限。 运行ldd识别二进制文件查看它使用的共享库: ? 当objdump运行时,你可以看到它已经被编译成一个静态的RPATH指向/tmp/program/main: ?

    2.8K50发布于 2018-02-06
  • 来自专栏全栈程序员必看

    qmake的使用

    /Bin/Debug/ QMAKE_LFLAGS_DEBUG += -Wl,-rpath=../../Bin/Debug/ QMAKE_LFLAGS_RELEASE += -L$$PWD/../.. /Bin/Debug/ QMAKE_LFLAGS_RELEASE += -Wl,-rpath=../.. /ThirdPartyLib/openrave-0.9/lib QMAKE_LFLAGS += -Wl,-rpath=../../../.. /ThirdPartyLib/openrave-0.9/lib #相对路径是相对工程文件pro的路径 编译时静态链接 # QMAKE_LFLAGS += -Wl,-rpath=../../../.. /ThirdPartyLib/openrave-0.9/lib/ #相对路径是相对工作路径 运行时动态链接 # QMAKE_LFLAGS += -Wl,-rpath=\\\$\$ORIGIN/jsoncpp

    1.3K20编辑于 2022-08-31
  • 来自专栏后场技术

    详解共享库的动态加载

    更好的方法是将依赖项放入文件中, 这就需要设置rpath和runpath。 rpath和runpath rpath并且runpath是我们的运行时搜索路径“清单”中最复杂的项目。 rpath的类型为DT_RPATH, runpath的类型为DT_RUNPATH。 rpath和runpath之间的唯一区别是搜索它们的顺序。 这意味着rpath不能用环境变量动态改变,而runpath可以。 设置rpath,看看是否可以让main工作: $ clang++ -o main main.o -lrandom -L. -Wl,-rpath,. 参数-Wl与-rpath逗号分隔将.标志传递给链接器。 或runpath通过传递-Wl,-rpath,<dir>(for rpath)或-Wl,--enable-new-dtags,-rpath,<dir>(for runpath)。

    4.1K20发布于 2021-05-18
  • 来自专栏萌新的日常

    百度面试题——迷宫问题(超详细解析)

    ; stackinit(&rpath); while (! stackempty(&rpath)) { PT top = stacktop(&rpath);//此时数据类型被改为PT printf("(%d ,%d)", top.row, top.col); printf("\n"); stackpop(&rpath); } stackdestroy( ; stackinit(&rpath); while (! stackempty(&rpath)) { PT top = stacktop(&rpath);//此时数据类型被改为PT printf("(%d

    1.8K30编辑于 2022-11-10
  • 来自专栏jiajia_deng

    macOS 应用正确签名并公证后分发依然提示“无法验证开发者”

    当检查组件依赖时发现了端倪,有问题的包中包含很多 LC_RPATH 为本地 conan 缓存的目录,运行 otool -l libroomkit.dylib 后如下所示: Load command 36 cmd LC_RPATH cmdsize 144 path /Users/jj.deng/.conan/data/ne_chromium_base/0.3.0 _/package/98268102ce1d6461fd77de96dbfe521aa4569a60/lib (offset 12) Load command 40 cmd LC_RPATH _/package/05d14d2fa2a4ecf20bb6d2fc8daa0c4823efd82d/lib (offset 12) Load command 41 cmd LC_RPATH 而修改后,直接在 package 函数中执行cmake.install()这样 cmake 会自动拷贝产物到 package 目录并且删除了原产物的 LC_RPATH

    1.7K30编辑于 2023-10-21
  • 来自专栏跟Qt君学编程

    Linux指定执行文件的动态库路径

    如添加/mylib动态库路径: export LD_LIBRARY_PATH=/mylib/:$LD_LIBRARY_PATH   除了上面方法外,我们还可以使用编译参数-Wl,-rpath=<动态库路径 -rpath为在运行链接时,会优先搜索-rpath的路径。 QMake写法1: QMAKE_LFLAGS为指定传递给链接器的一组常规标志。 QMAKE_LFLAGS += -Wl,-rpath=/mylib1 QMake写法2: QMAKE_RPATHDIR为指定在链接时添加到可执行文件的库路径列表,以便在运行时优先搜索这些路径。

    8.9K20发布于 2020-05-08
  • 来自专栏自学气象人

    Linux 动态库 undefined symbol 原因定位与解决方法

    假如 rpath 存在相同名字的 .so 文件,会优先加载这个路径的文件。 在遇到 undefined symbol 问题时,使用 readelf -d | grep rpath 查看: $ readelf -d libSXVideoEngineJni.so | grep rpath 0x000000000000000f (RPATH) Library rpath: [/home/slayer/workspace/SXVideoEngine-Core/ Use of DT_RPATH is deprecated. 0x000000000000000f (RPATH) Library rpath: [/home/slayer/workspace/SXVideoEngine-Core/

    9.6K10编辑于 2023-06-20
  • 来自专栏jiajia_deng

    Qt for iOS 应用使用自定义动态库 Framework

    对于 @rpath 的说明,请看这里:https://www.cnblogs.com/csuftzzk/p/mac_run_path.html Qt 项目配置引入 framework Qt 引入 framework 下面多了一条 Copy file to bundle 的项目: 但是当你尝试在 iOS 或者模拟机中运行这个应用时你会发现又有新的错误了,如下所示: dyld: Library not loaded: @rpath 这是动态库 framework 设置的,根据上面文章的资料,我们要在调用该模块的应用中设置 rpath 的搜索范围,让其能找到我们的动态库文件。 Qt 项目中添加如下配置: # 添加应用的 runpath 路径,因为 my_dylib 动态库 Framework 设置的 install path 为 rpath,所以应用使用时需要单独设置 QMAKE_LFLAGS += -Wl,-rpath,@loader_path/Frameworks 如此设置后,在 Qt 中就可以成功编译程序并运行在模拟器或真机上了,如果还有任何疑问欢迎留言我们一起讨论。

    1.9K20发布于 2020-01-04
  • 来自专栏gopher云原生

    我给 gin 提交了一行代码

    = c.Request.URL.Path unescape := false if engine.UseRawPath && len(c.Request.URL.RawPath) > 0 { rPath = c.Request.URL.RawPath unescape = engine.UnescapePathValues } if engine.RemoveExtraSlash { rPath = cleanPath(rPath) } // Find root of the tree for the given HTTP method t := engine.trees for i method 对应不上,则继续下一次循环 continue } root := t[i].root // 在 tree 中找到 route value := root.getValue(rPath = http.MethodConnect && rPath !

    1.5K30发布于 2021-10-18
  • 来自专栏IOT物联网小镇

    链接两个"名字完全一样"的【动态库】,你会怎么处理?

    ./ -Wl,-rpath=./ 执行: $ ./main result0 = 2.200000 result1 = 3.300000 完美! ", result2); return 0; } 编译一下试试: $ gcc -m32 -o main main.c -lRobotMath -lRobotMath2 -L./ -Wl,-rpath patchelf 这个工具,就提供了这样的功能:查看或修改动态库文件的内部信息,包括:SONAME, 依赖的其他动态库,rpath 路径信息等等。 [--set-rpath RPATH] [--remove-rpath] [--shrink-rpath] [--print-rpath] [--force-rpath] [--add-needed 再次编译一下可执行程序: $ gcc -m32 -o main main.c -lRobotMath -lRobotMath2 -L./ -Wl,-rpath=./ 没有报错! 执行一下: $ .

    3.1K20发布于 2021-09-29
  • 来自专栏zhimingcow

    iOS framework踩坑之路

    framework加载失败 在真机运行,如果出现错误“dyld: Library not loaded: @rpath/XX.framework/XX,..... Embedded Content中将framework设置为“Embed & Sign” framework需要签名才能用 在真机运行,如果出现错误“dyld: Library not loaded: @rpath framework版本不一致 在真机运行,如果出现错误“dyld: Library not loaded: @rpath/XX.framework/XX,.....

    2.6K20发布于 2020-03-12
领券