小编Nic*_*ult的帖子

如何使用 clang 获取共享库上的符号?

我正在尝试将我的库编译为 Mac 上的共享库。你可以在这个 PR上找到我的尝试。

这是我正在使用的命令行和详细结果:

$ gcc -v -dynamiclib -fPIC -o .../luos_engine/.pio/build/native_lib/libluos_engine.dylib .../luos_engine/.pio/build/native_lib/libdf9/libluos_engine.a
Apple clang version 15.0.0 (clang-1500.1.0.2.5)
Target: x86_64-apple-darwin23.2.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -dylib -arch x86_64 -platform_version macos 14.0.0 14.2 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -o .../luos_engine/.pio/build/native_lib/libluos_engine.dylib -L/usr/local/lib .../luos_engine/.pio/build/native_lib/libdf9/libluos_engine.a -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/15.0.0/lib/darwin/libclang_rt.osx.a
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,编译似乎可以正常工作,但是当我尝试获取库上的符号时,我什么也没有:

$ nm .pio/build/native_lib/libws_luos_engine.dylib
.pio/build/native_lib/libluos_engine.dylib: no symbols
Run Code Online (Sandbox Code Playgroud)

为什么我没有任何符号?

c macos linker shared-libraries clang

5
推荐指数
1
解决办法
175
查看次数

用于低级数据结构的Bitfield和union以及Rust中的类型转换

我需要管理位域数据和联合.这是我认为在C中的代码:

typedef struct __attribute__((__packed__)){
    union {
        struct __attribute__((__packed__)){
            unsigned short protocol : 4;
            unsigned short target : 12;
            unsigned short target_mode : 4;
            unsigned short source : 12;
            unsigned char cmd;
            unsigned char size;
        };
        unsigned char unmap[6]; // Unmapped form.
    };
}header_t;
Run Code Online (Sandbox Code Playgroud)

我使用此联合可以轻松地从映射到未映射的表单切换.我可以写入header_t.protocol或者使用header_t.source它作为u8数组返回header_t.unmap.此开关不使用时间并共享相同的内存块.

我试着在Rust中做同样的事情,但我找不到干净的方法来做到这一点.我成功地使用了两个结构并专门impl在它们之间切换:

#[allow(dead_code)]
pub struct Header {
    protocol:    u8,  // 4 bits used
    target:      u16, // 12 bits used
    target_mode: u8,  // 4 bits used
    source:      u16, …
Run Code Online (Sandbox Code Playgroud)

casting unions rust

3
推荐指数
1
解决办法
190
查看次数

标签 统计

c ×1

casting ×1

clang ×1

linker ×1

macos ×1

rust ×1

shared-libraries ×1

unions ×1