小编Pat*_* B.的帖子

使用LD_PRELOAD重载调用共享库的C函数

我正在按照这个答案来覆盖对C库的C函数的调用.

我想我做的一切都正确,但它不起作用:

我想覆盖"DibOpen"功能.这是我在运行应用程序时传递给LD_PRELOAD环境变量的库代码:

DIBSTATUS DibOpen(void **ctx, enum Board b)
{
    printf("look at me, I wrapped\n");

    static DIBSTATUS (*func)(void **, enum Board) = NULL;
    if(!func)
        func = dlsym(RTLD_NEXT, "DibOpen");
    printf("Overridden!\n");
    return func(pContextAddr, BoardType, BoardHdl);
}
Run Code Online (Sandbox Code Playgroud)

nm lib.so | grep DibOpen节目的输出

000000000001d711 T DibOpen
Run Code Online (Sandbox Code Playgroud)

当我像这样运行我的程序时

LD_PRELOAD=libPreload.so ./program
Run Code Online (Sandbox Code Playgroud)

program用-ldl 链接我,但ldd program没有显示libdl.so的链接

它停止了

 symbol lookup error: libPreload.so: undefined symbol: dlsym
Run Code Online (Sandbox Code Playgroud)

.我该怎么做才能进一步调试?我的错误在哪里?

c gcc dynamic-linking ld

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

字典 - 如果密钥不存在,如何更新或创建值?

我有以下代码来添加或更新,如果已经存在,则在以下代码中使用dict()-value dict:

if id not in self.steps:
    self.steps[ id ] = step
else:
    self.steps[ id ].update(step)
Run Code Online (Sandbox Code Playgroud)

这很好,但我想知道我是否可以简化代码.我试过使用get,但是如果key不存在,get似乎返回了元素的副本(或者只是一个新元素,与缺少的键无关?).

self.steps.get( id ).update(step)
Run Code Online (Sandbox Code Playgroud)

我有什么选择?

python dictionary

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

在 Git 中重置所有暂存文件的最简单方法是什么?

我以前使用git reset过单个文件,但我经常发现自己必须在提交前取消暂存多个文件。是否有取消暂存所有暂存文件的命令?我在文档(http://git-scm.com/docs/git-reset)上找不到它。

git version-control

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

是什么使volatile破坏了结构的指针算法?

在我们的代码中,我们使用指向结构的指针来推导硬件寄存器的地址,以保持代码的可读性。

例如:

#include <cstdint>
#include <iostream>

struct reg {
    uint32_t t;
    uint32_t x;
    uint32_t value;
};

int main(void)
{
    struct reg *r = reinterpret_cast<struct reg *>(0x800000);

    std::cerr << &r->value << "\n";
    std::cerr << &r->t << "\n";
    std::cerr << &r->x << "\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

hardware-base-address是0x800000,使用writeReg(&t->x, 123);它将使它写入0x800004。

偶然地,volatile-keyword被错误地放置在结构定义中:


struct reg {
    volatile uint32_t t;
    volatile uint32_t x;
    volatile uint32_t value;
};
Run Code Online (Sandbox Code Playgroud)

现在发生的是,所有字段都使用&r->field-syntax 偏移了1 。

g++ (Debian 9.2.1-4) 9.2.1 20190821在这里使用。

使用printf和C-style-cast在C中重写测试,即使使用volatile也可以再次提供正确的偏移量。

我无法理解为什么volatile关键字似乎破坏了指针算术?为什么?怎么了?

c++ pointers structure

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

如何在CMake中将组合的编译器选项与target_compile_options一起传递?

我正在使用自定义的clang / llvm来构建我的项目。定制基本上是添加优化过程。在使用clang进行编译时,要将选项传递给我的通行证,我正在使用:

clang [..] -mllvm -MyOption [..]
Run Code Online (Sandbox Code Playgroud)

现在,我需要以这种方式传递多个选项:

clang [..] -mllvm -MyOption -mllvm -MyOption2=value [..]
Run Code Online (Sandbox Code Playgroud)

结合CMake的target_compile_options()停止功能,CMake删除了第二个,-mllvm因为它似乎认为它是重复的。

target_compile_options(vslib INTERFACE -mllvm -MyOption)
target_compile_options(vslib INTERFACE -mllvm -MyOption2=val)
Run Code Online (Sandbox Code Playgroud)

我试着把"这两个选项放在一起,不起作用。

有没有办法用CMake做到这一点?

cmake llvm clang

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

OpenCL函数length()和fast_length()之间有什么区别?

这个OpenCL参考表(断开链接)的第3页,有两个内置的向量长度函数,它们具有相同的参数:length()half_length().

这些功能有什么区别?我从名字中得到一个比另一个更快但在什么情况下?对于这种速度增加,它是否具有准确性?如果不是,为什么一个曾经使用length()fast_length()

performance gpgpu opencl

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

如何让OpenCl看到intel和nvidia设备?

我想知道如何让OpenCl"看到"我的K20.Xeon和Xeon Phi在同一时间?

特别是我对这里使用两个库感到困惑(来自NVidia和Intel).

怎么做,如果可能的话?

gpu nvidia intel opencl

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

如何确保write(2)已将所有数据写入套接字/文件描述符?

我正在使用write(man 2 write)将数据写入具有已建立,阻塞且非常慢的TCP连接的套接字.我正在写大块的数据.write返回写入的实际大小,当然发生并非所有数据都是由于(可能)超出此问题范围的原因而写入的.

为了确保我将写入调用封装在这样的小循环中:

do {
    ssize_t ret = write(client, p, count);
    if (ret <= 0)
        break;
    p += ret;
    count -= ret;
} while (count);

if (count != 0) 
    return -ENODEV;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法,比如在文件描述符上设置一个标志,从而让低层处理它?

c sockets

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

查找在给定指针类型上调用free的位置

我正在将类型从C风格的结构转换为C++风格的结构; 我加入的成员,这将迫使类型需要一个构造函数,因此,我必须切换mallocfreenewdelete.通过查找,我可以在任何地方找到分配类型(由于此代码库的约定)sizeof(TYPE).

有什么办法可以找到传递该类型指针的所有实例free吗?我认识到,由于参数freevoid*,这不是一个保证我发现到处类型被释放.

例如,我可以free以某种方式重载,以便在任何地方free(TYPE*)调用时都会出现编译错误,但在其他任何地方都没有?

c++ visual-c++

0
推荐指数
1
解决办法
101
查看次数