小编Han*_*olo的帖子

未定义的符号引用,即使nm表示此符号存在于共享库中

这可能有什么问题?我有以下简单的类:

#include  "libmnl/libmnl.h"

int main() {
    struct mnl_socket *a = mnl_socket_open(12);
}
Run Code Online (Sandbox Code Playgroud)

运行简单的gcccompile(gcc -lmnl main.c)后,我得到以下错误:

/tmp/cch3GjuS.o: In function `main':
main.c:(.text+0xe): undefined reference to `mnl_socket_open'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

在共享库上运行nm表明它实际上已找到:

aatteka@aatteka-Dell1:/tmp$ nm -D /usr/lib/libmnl.so | grep mnl_socket_open
0000000000001810 T mnl_socket_open
Run Code Online (Sandbox Code Playgroud)

这是在Ubuntu 12.04上发生的.该libmnl-dev的libmnl0包安装.该strace输出gcc表明,ld使用正是*.so文件:

[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.so", 0x7fff2a39b470) = -1 ENOENT (No such file or directory)
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.so", O_RDONLY) = -1 ENOENT (No such file or …
Run Code Online (Sandbox Code Playgroud)

linux linker gcc shared-libraries

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

如何从单个流程实例创建多个网络命名空间

我正在使用以下C函数从单个流程实例创建多个网络命名空间:

void create_namespace(const char *ns_name)
{
    char ns_path[100];

    snprintf(ns_path, 100, "%s/%s", "/var/run/netns", ns_name);
    close(open(ns_path, O_RDONLY|O_CREAT|O_EXCL, 0));
    unshare(CLONE_NEWNET);
    mount("/proc/self/ns/net", ns_path, "none", MS_BIND , NULL);
}
Run Code Online (Sandbox Code Playgroud)

在我的进程创建了所有namspaces之后,我在任何一个网络命名空间(带命令)中添加了一个tap接口ip link set tap1 netns ns1,然后我实际上在所有命名空间中看到了这个接口(可能,这实际上是一个名称不同的命名空间).

但是,如果我通过使用多个进程创建多个名称空间,那么一切正常.

这可能有什么问题?我是否必须将任何其他标志传递unshare()给单个流程实例?是否存在单个流程实例无法创建多个网络命名空间的限制?或者是否存在mount()调用问题,因为/proc/self/ns/net实际上已多次挂载?

更新: 似乎unshare()函数正确创建了多个网络命名空间,但/var/run/netns/实际上所有挂载点都引用了该挂载中安装的第一个网络命名空间.

Update2: 似乎最好的方法是fork()另一个进程并从那里执行create_namespace()函数.无论如何,我很高兴听到一个更好的解决方案,不涉及fork()调用或至少得到一个确认,证明不可能从单个进程创建和管理多个网络命名空间.

Update3: 我可以使用以下代码使用unshare()创建多个名称空间:

int  main() {
    create_namespace("a");
    system("ip tuntap add mode tap tapa");
    system("ifconfig -a");//shows lo and tapA interface
    create_namespace("b");
    system("ip tuntap add mode tap tapb");
    system("ifconfig …
Run Code Online (Sandbox Code Playgroud)

c linux networking network-programming linux-namespaces

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

从自定义操作捕获ArgumentTypeError异常

从我自己的自定义操作中抛出ArgumentTypeError异常并让argparse为我捕获它的最佳做法是什么?

似乎argparse的try/except块不能为我的自定义操作处理此异常.虽然它对内置动作很好.

class unique_server_endpoints(argparse.Action):
    """This class avoids having two duplicate OuterIPs in the client argument list"""
    def __call__(self, parser, namespace, values, option_string=None):
        ips = set()
        endpoints = []
        for r in values:
            ep = server_endpoint(r)
            if ep[0] in ips:
                raise argparse.ArgumentTypeError("Duplicate OuterIPs found")
            else:
                ips.add(ep[0])
                endpoints.append(ep)
        setattr(namespace, self.dest, endpoints)
Run Code Online (Sandbox Code Playgroud)

group.add_argument('-c', "--client", nargs = 2,
            dest = "servers", action = unique_server_endpoints,
Run Code Online (Sandbox Code Playgroud)

例如,在上面的代码中,如果我有重复的IP,则异常将落入函数并打印丑陋的堆栈跟踪.我不希望这样,我也不想在main中放置一个try/except块.

python exception argparse

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

在panic()发生之前使用trace-cmd/ftrace来获取function_graph

我试图trace-cmd收集有关我看到的内核崩溃的更多信息.不幸的是,内核崩溃时出现"内核崩溃 - 不同步"消息(即套接字和文件缓冲区没有刷新,因此崩溃时缓冲区中的任何内容都不可避免地丢失).

有办法:

  1. 强制trace-cmd进程将其缓冲区刷新到文件系统或套接字?要么
  2. make trace-cmd/ftrace以避免缓冲(即在场景后面调用printk()并使用netconsole)?

由于我trace-cmd在虚拟化环境中运行该命令,因此我不关心硬盘驱动器是否偶尔会损坏,因为我可以简单地恢复到最后一个良好的快照或重新部署VM.

crash ftrace linux-kernel panic

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

第二次从Proc-FS文件读取时使用lseek()是否安全

  1. 是否可以安全使用lseek(fd,0)然后再read(fd,buf)使用/proc/stat文件而不是重新打开它以便下次获取此文件的更新内容?
  2. mmap()打开这个文件后的调用真的如何(见下文)?

我遇到的问题是顶级报告CPU使用率太低(软件中断为10%对比100%).strace表示top不会重新打开此文件,而是lseeks开始并再次读取它.不知何故,下次从这个文件读取的内容与我/proc/stat单独运行cat for file 时的内容不匹配.

另外如果我同时/proc/stat在循环中运行top和cat ,那么top会开始报告正确的CPU使用率.

我发现的另一个区别是top mmap()在打开/proc/stat文件后立即使用call ,而cat不是那样做.我不确定这是否也与我的问题有关(因为filesdes=-1这里):

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7b37649000
Run Code Online (Sandbox Code Playgroud)

我正在使用带有2.6.32-27服务器映像的Ubuntu 10.04.1桌面版.CPU是Intel Q6600.

linux cpu-usage seek procfs

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

远程事后coredump分析,没有共享系统库的确切调试符号

你怎么经常解决这个问题?想象一下,线程在Computer1上的libc代码(这是一个系统共享库)内崩溃,然后生成一个coredump.但是,将分析此coredump的Computer2可能具有不同版本的libc.

所以:

  1. 在远程计算机上拥有相同的共享库有多重要?gdb会在Conputer2上没有完全相同版本的libc的情况下正确重建stacktrace吗?

  2. 为libc提供正确的调试符号有多重要?gdb会在Computer2上没有完全相同的调试符号的情况下正确地重建堆栈跟踪吗?

  3. 什么是避免共享系统库的调试符号不匹配问题的"正确"方法?对我来说,似乎没有单一的解决方案以优雅的方式解决这个问题?也许有人可以分享他的经历?

gdb remote-debugging shared-libraries postmortem-debugging

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

gdb如何为C++重建stacktrace?

我把整个问题分成了小问题:

  1. GDB能够使用哪种不同的算法来重建堆栈跟踪?
  2. 每个堆栈跟踪重建算法如何在高级别工作?的优点和缺点?
  3. 什么样的元信息编译器需要在程序中为每个堆栈跟踪重建算法提供工作?
  4. 还有相应的g ++编译器开关启用/禁用特定算法?

gdb g++ stack-trace

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

如何在x86_64上交叉编译Raspberry Pi项目?(因路径无效而丢失*.so)

我正在x86_64/Ubuntu 13.04上交叉编译Raspberry Pi项目.调用cmake后:

cmake -DCMAKE_TOOLCHAIN_FILE=./Toolchain-raspberry.pi .
Run Code Online (Sandbox Code Playgroud)

然后make,链接失败:

/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../lib/gcc/arm-linux-gnueabihf/4.7.2/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lopencv_gpu
...
Run Code Online (Sandbox Code Playgroud)

问题是cmake生成的Makefile以下列方式调用链接器:

/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++       CMakeFiles/Watson.dir/main.cpp.o  -o Watson -rdynamic -lopencv_gpu -lopencv_contrib -lopencv_legacy -lopencv_objdetect -lopencv_calib3d -lopencv_features2d -lopencv_video -lopencv_highgui -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core 
Run Code Online (Sandbox Code Playgroud)

它没有指定这些共享库的路径.但是,如果我手动将--sysroot/opt/rpi-rootfs / flag添加到上面的命令,则链接会成功.

在交叉编译时,建议让cmake指定共享库的正确路径的方法是什么?

这是我的Toolchain-raspberry.pi文件:

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)

SET(CMAKE_C_COMPILER /opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER /opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++)

SET(CMAKE_FIND_ROOT_PATH "/opt/rpi-rootfs/")
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Run Code Online (Sandbox Code Playgroud)

这是我的CMakeList.txt文件:

cmake_minimum_required(VERSION 2.8)

project(watson)
add_executable(Watson main.cpp)

find_package(OpenCV REQUIRED)
target_link_libraries(Watson ${OpenCV_LIBS})
Run Code Online (Sandbox Code Playgroud)

目标中的/ usr和/ lib目录是rsync到/ opt/rpi-rootfs /并且所有必需的*.so文件都在那里.阅读完cmake文档后,我原本 …

c++ opencv cmake cross-compiling raspberry-pi

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

如何找出用于构建二进制文件的*.c和*.h文件?

我正在构建一个构建多个共享库和可执行文件的项目.用于构建这些二进制文件的所有源文件都位于单个/ src目录中.因此,弄清楚哪些源文件用于构建每个二进制文件(存在多对多关系)并不明显.

我的目标是编写一个脚本,为每个二进制文件解析一组C文件,并确保只从它们中调用正确的函数.

一种选择似乎是尝试从Makefile中提取此信息.但是这对生成的文件和标题不起作用(由于依赖于Includes).

另一种选择可能是简单地浏览调用图,但这会变得复杂,因为很多函数都是通过使用函数指针来调用的.

还有其他想法吗?

c linux gcc build

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

Bash脚本和C++之间的持久IPC

问题:每次事件发生时都有一个C应用程序调用Bash脚本.还有一个C++应用程序需要跟踪这些事件.在C++应用程序是由选择()事件循环驱动.在Bash脚本C++应用程序之间实现最简单的IPC是什么?

C Application ---Each time calls Bash script---> Bash application ---???---> C++ Application
Run Code Online (Sandbox Code Playgroud)

我想到的几个解决方案:

  1. 要使用TCP网络套接字,但这意味着select必须处理Listening和Actual套接字的事件
  2. 要使用命名管道,但是一旦bash脚本终止,管道的另一端也会关闭

是否有更简单的东西允许我在select()中只使用一个文件描述符?

c++ linux bash ipc

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

用于clang静态分析的链接器命令的用法

我正在开发一个带有python-clang-3.6库的静态分析工具,可以让我绘制函数调用图.

要正确创建,TranslationUnit我需要使用相应的编译命令(即clang.cindex.Index.parse(c_file, compile_command)).但是,我相信,为了能够正确互连,TranslationUnits我还需要使用链接器命令来知道哪些TranslationUnit使用其他功能TranslationUnits.这是我的项目中的一个问题,实际上有多个二进制文件是使用单个"make"调用构建的,有些TranslationUnits可能有冲突的符号名称,所以我不能假设它们都是相互连接的.

解决此问题的最佳方法是什么,以便我的工具知道C文件中的哪些函数可以调用其他C文件中的函数?

现在我看到两个选择:

  1. 以某种方式检索和使用链接器命令; 这个选项看起来很棘手,因为它没有直接支持clang(至少是clang python库); 要么
  2. 在遍历TranslationUnit的AST树时,记住Header文件中函数声明的位置.如果由于宏处理,我会得到不同的行号或者具有不同的隐式函数声明,这个选项看起来很棘手TranslationUnits.

还有其他选择吗?哪个选项以及为什么会选择你?

c static-analysis clang call-graph

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