小编Ale*_*lex的帖子

linux-kernel模块中的系统调用拦截(内核3.5)

我需要用自己的实现替换标准系统调用(例如SYS_mkdir).

正如我在一些来源中读到的,包括Stackoverflow上的这个问题,sys_call_table自内核版本以来,它不是导出的符号2.6.

我尝试了以下代码:

    #include <linux/module.h> 
    #include <linux/kernel.h> 
    #include <linux/unistd.h> 
    #include <asm/syscall.h> 

    int (*orig_mkdir)(const char *path); 

    ....

    int init_module(void) 
    { 
            orig_mkdir=sys_call_table[__NR_mkdir]; 
            sys_call_table[__NR_mkdir]=own_mkdir;  
            printk("sys_mkdir replaced\n"); 
            return(0); 
    } 

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

不幸的是我收到编译错误:

 error: assignment of read-only location ‘sys_call_table[83]’
Run Code Online (Sandbox Code Playgroud)

如何更换系统调用?

编辑:有没有内核修补的解决方案?

c module kernel-module linux-kernel

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

Perl中的C代码预处理

我在C代码解析器上工作Perl.

目前我需要预处理代码.预处理的实现似乎需要做很多工作,所以我正在寻找一个允许预处理文件的脚本或库.

我发现了以下可能性:

  1. 文字:: CPP
  2. 过滤:: CPP

这两个都需要cpp我在Windows机器上没有的.还有其他选择吗?

c perl preprocessor

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

getter和setter的`noexcept`说明符

假设我有以下代码:

class A {
    public:
        void SetInteger(const int val) noexcept { integerMember = val; }
        void SetString(const std::string& val) { stringMember = val; }
        int GetInteger() const noexcept { return integerMember; }
        std::string GetString() const { return stringMember; }

    private:
        int integerMember;
        std::string stringMember;
}
Run Code Online (Sandbox Code Playgroud)

noexcept对于整数类型和指针的使用对我来说非常明显.

但是,如果不是类和结构之类的整数类型的建议是什么,它们不会在构造函数/复制构造函数和它们的部件的构造函数中明确地抛出异常(意味着throw在构造函数体中使用)?

c++ c++11

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

高效的浮点比较(Cortex-A8)

有一个很大的(~100 000)浮点变量数组,并且有一个阈值(也是浮点).

问题是我必须将数组中的每个变量与阈值进行比较,但NEON标志传输需要很长时间(根据分析器约20个周期).

有没有有效的方法来比较这些值?

注意:由于舍入错误无关紧要,我尝试了以下方法:

float arr[10000];
float threshold; 
....

int a = arr[20]; // e.g.
int t = threshold;
if (t > a) {....}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我得到以下处理器命令序列:

vldr.32        s0, [r0]
vcvt.s32.f32   s0, s0
vmov           r0, s0    <--- takes 20 cycles as `vmrs APSR_nzcv, fpscr` in case of 
cmp            r0, r1         floating point comparison
Run Code Online (Sandbox Code Playgroud)

当转换发生在NEON时,无论我是通过描述的方式还是浮点数来比较整数.

c c++ arm7 neon cortex-a8

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

通过10个pthreads使用共享变量

问题在于:

我想写一个创建10个线程的短程序,每个程序打印一个通过指针传递给线程函数的"id".

该计划的完整代码如下:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

struct params {
        pthread_mutex_t mutex;
        int id;
};

typedef struct params params_t;

void* hello(void* arg){
    int id;
    pthread_mutex_lock(&(*(params_t*)(arg)).mutex);
    id = (*(params_t*)(arg)).id;
    pthread_mutex_unlock(&(*(params_t*)(arg)).mutex);
    printf("Hello from %d\n", id);
}


int main() {
    pthread_t threads[10];
    params_t params;
    pthread_mutex_init (&params.mutex , NULL);

    int i;
    for(i = 0; i < 10; i++) {
            params.id = i;
            if(pthread_create(&threads[i], NULL, hello, &params));
    }

    for(i = 0; i < 10; i++) {
            pthread_join(threads[i], NULL);
    }

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

假定的输出(按此顺序不必要): …

c linux mutex pthreads

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

双和NaN的比较结果是什么?

我有以下程序:

#include <iostream>
#include <cmath>

int main() {
    double a = 1;
    double b = nan("");

    std::cout << (a > b) << std::endl;
    std::cout << (b > a) << std::endl;

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

输出:

0
0
Run Code Online (Sandbox Code Playgroud)

一般来说,从含义来看nan- not a number很明显,任何操作nan都是毫无意义的.从IEEE-754我在互联网上发现,我发现如果在FPU中至少有一个操作数也是nan结果nan,但我没有发现正常值与nan上例中的比较.

标准说什么呢?

c++ nan c++11

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

添加 boost 库作为 Bazel 依赖 C++

我有以下设置将 boost 库添加到我的 C++ 项目中。 /opt/boost/release包含我的 boostincludelib目录。我的 boost版本是 1.65.1 并按照文档使用以下命令构建。

$ sudo ./bootstrap.sh --prefix=release --with-python=python3 --with-icu=
$ ./b2 install -j 4
Run Code Online (Sandbox Code Playgroud)

我尝试了带和不带--with-python=python3标志。

工作空间

new_local_repository(
    name = "boost",
    build_file = "boost.BUILD",
    path = "/opt/boost/release",
)
Run Code Online (Sandbox Code Playgroud)

boost.BUILD

cc_library(
    name = "boost",
    srcs = glob(["lib/*.so*"]),
    hdrs = glob(["include/**/*.hpp", "include/**/*.h"]),
    includes = ["include"],
    visibility = ["//visibility:public"],
    linkstatic = 1,
)
Run Code Online (Sandbox Code Playgroud)

建造

cc_binary(
    name = "experiments",
    srcs = ["main.cpp"],
    deps = [
        "@boost//:boost",
    ],
)
Run Code Online (Sandbox Code Playgroud)

主程序

#include <boost/progress.hpp> …
Run Code Online (Sandbox Code Playgroud)

c++ boost bazel

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

计算从外部程序使用malloc()分配的块

我想写一个"简单"的内存泄漏检查器.

为了做到这一点,我需要计算一个程序中的一些malloc()ed内存块,但问题是我不想修改它的源代码.

换句话说,我想实现以下接口:

memory_check <executable name>
Run Code Online (Sandbox Code Playgroud)

我无法访问可执行文件源的地方.

首先我应该尝试拦截系统调用.但我读到" 所以malloc不会调用任何系统调用? "它似乎不是一个想法,也因为它会极大地减慢所有系统(我可以想象).

是否还有其他选项来拦截malloc()电话?

c linux malloc

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

Cygwin:g ++ 5.2:'to_string'不是'std'的成员

以下简单程序无法使用gcc在cygwin中编译

#include <string>
#include <iostream>

int main()
{
  std::cout << std::to_string(4) << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

命令行:

$ g++ -std=c++0x to_string.cc
Run Code Online (Sandbox Code Playgroud)

错误:

to_string.cc: In function ‘int main()’:
to_string.cc:6:16: error: ‘to_string’ is not a member of ‘std’
   std::cout << std::to_string(4) << std::endl;
Run Code Online (Sandbox Code Playgroud)

G ++版本:

$ g++ --version
g++ (GCC) 5.2.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. …
Run Code Online (Sandbox Code Playgroud)

c++ gcc cygwin c++11

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

Apple LLVM 3.0编译器自动从float转换为double

有一部分代码:

*det_ptr++ = (float)(dx*dy - 0.81*dxy*dxy);

其中dx,dy和dxy是浮点数.

Apple LLVM 3.0编译器为它进行以下组装:

+0x250  vldr.32                        s0, [r13, #+140]
+0x254  vldr.32                        s1, [r13, #+136]
+0x258  vmul.f32                       s0, s0, s1
+0x25c  vcvt.f64.f32                   d16, s0 <-------------- cast from float to double
+0x260  vldr.32                        s0, [r13, #+132]
+0x264  vcvt.f64.f32                   d17, s0 <-------------- cast from float to double
+0x268  vldr.64                        d18, [r13, #+16]
+0x26c  vmul.f64                       d17, d18, d17
+0x270  vldr.32                        s0, [r13, #+132]
+0x274  vcvt.f64.f32                   d19, s0 <-------------- cast from float to double
+0x278  vmul.f64                       d17, d17, d19 …
Run Code Online (Sandbox Code Playgroud)

c floating-point assembly casting llvm

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