V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wjx0912
V2EX  ›  C++

求教, mac 下 cmake c++工程编译后 elf 里面还有很多路径字符串

  •  
  •   wjx0912 · 3 天前 · 343 次点击

    windows 也有这样的问题,后来参考 visual studio 设置 cpp flags 后解决了。 但是 mac 找了一堆参数还是不行。

    测试代码: https://github.com/PacktPublishing/Modern-CMake-for-Cpp/blob/main/examples/chapter06/05-dynamic/CMakeLists.txt 编译:

    cmake . -G "Unix Makefiles"
    cmake --build . --config Release
    

    生成的文件导出的 string 有本地文件夹路径字符串(但实际项目里面并没有用到__path__)

    下图是用 cutter (开源反编译工具 https://github.com/rizinorg/cutter ,类似 IDA pro )

    添加了一些参数(-flto ,-g0 还是不行),求大佬指点迷津

    3 条回复    2024-12-01 17:11:45 +08:00
    lixile
        1
    lixile  
       2 天前
    取消-dynamic 的编译宏
    然后编译后 strip 一下
    ecnelises
        2
    ecnelises  
       2 天前
    这个路径是 macOS ld 写到里面的 rpath ,你用 otool -l main_1 就能打印出来。rpath 是告诉 loader 启动程序时去哪里找依赖的动态库的路径列表。所以你要去搜能不能在 CMake 里改 rpath
    wjx0912
        3
    wjx0912  
    OP
       22 小时 35 分钟前
    @lixile @ecnelises
    感谢 2 位老总。对 mac 实在是不熟悉。cmake 乱加一通算是搞定了,虽然有些参数还不太理解:
    set(CMAKE_CXX_VISIBILITY_PRESET hidden)
    SET(CMAKE_CXX_FLAGS "-g -w -O2")
    LINK_FLAGS "-Wl,-F/Library/Frameworks"
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -g0 -Wl,--strip-all -s -flto -fomit-frame-pointer -fvisibility=hidden")
    set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -dead_strip -Wl,-strip-all -flto -s -fvisibility=hidden -Xlinker")


    set(MACOSX_RPATH TRUE)
    set(CMAKE_SKIP_BUILD_RPATH FALSE)
    set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
    set(CMAKE_INSTALL_RPATH "@loader_path")
    set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

    编译完再 strip 。基本没有冗余了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5530 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:47 · PVG 15:47 · LAX 23:47 · JFK 02:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.