小编Emp*_*ian的帖子

创建符号链接失败

我正在尝试在我的 CentOS 6.7 机器上升级 glibcxx。我做了这里给出的步骤。

现在,当我这样做时:

strings /opt/google/chrome/lib/libstdc++.so.6 | grep GLIBC
Run Code Online (Sandbox Code Playgroud)

我列出了 GLIBCXX_3.4 到 GLIBCXX_3.4.22。

为了在我的 Syantaxnet 构建中使用这个文件,我创建了一个符号链接:

ln -s /opt/google/chrome/lib/libstdc++.so.6 /usr/lib64/libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

ln: creating symbolic link `/usr/lib64/libstdc++.so.6': File exists
Run Code Online (Sandbox Code Playgroud)

编辑1:

我认为错误是由于相同的文件名并将 /opt/google/chrome/lib/libstdc++.so.6 重命名为 libstdc++.so.6_new。命令仍然失败。

有人可以帮我解决这个问题吗?另外,这是错误的解决方案:

/usr/local/bin/bazel: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /usr/local/bin/bazel)
/usr/local/bin/bazel: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /usr/local/bin/bazel)
Run Code Online (Sandbox Code Playgroud)

linux symlink centos6 syntaxnet

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

segfault,但不在valgrind或gdb中

在我的项目中,有一个库,其代码可以使用Autodesk的FBX SDK 2017.1加载fbx.

在调试和发布中加载fbx崩溃.崩溃发生在两种不同的方式,似乎是随机的:

  • 崩溃要么只是"分段错误"(大部分时间)
  • 崩溃是可能涉及崩溃的所有库的转储,以及realloc()调用的问题.(每隔一段时间)从消息的上下文中,我无法确定可能的重新分配(消息之后是所有链接的lib的转储).

代码确实包含realloc()调用,特别是在FbxStream的自定义实现中使用的缓冲区分配中

对于Windows,大多数代码路径完全相同,只重新实现了许多特定于平台的部分.在Windows上,它按预期运行.

令我震惊的是,如果我在gdb或valgrind中运行程序,崩溃就会消失!所以我开始寻找未初始化的成员/价值观,但到目前为止我找不到任何可疑的东西.我使用了CppDepend/CppCheck和VS2012代码分析,但是在未初始化的变量/成员上都是空的

给出FBX加载的一些背景知识; FBX SDK有许多方法可以处理不同类型的资源(obj,3ds,fbx,..).它们可以从文件或流中加载.为了支持大文件,流选项是更相关的选项.下面的代码远非完美,但我目前最感兴趣的是valgrind/gdb不会崩溃的原因.我把SDK文档放在ReadString之上,因为它是最复杂的.

class MyFbxStream : public FbxStream{
    uint32 m_FormatID;
    uint32 m_Error;
    EState m_State;
    size_t m_Pos;
    size_t m_Size;
    const Engine::Buffer* const m_Buffer;
    MyFbxStream& operator = (const MyFbxStream& other) const;
public:
    MyFbxStream(const Engine::Buffer* const buffer) 
    : m_FormatID(0)
    , m_Error(0)
    , m_State(eClosed)
    , m_Pos(0)
    , m_Size(0)
    , m_Buffer(buffer) {};
    virtual ~MyFbxStream() {};
    virtual bool Open(void* pStreamData) {
        m_FormatID = *(uint32*)pStreamData;
        m_Pos = 0;
        m_State = eOpen;
        m_Size = m_Buffer->GetSize();
        return true;
    }
    virtual …
Run Code Online (Sandbox Code Playgroud)

c++ gdb valgrind segmentation-fault fbx

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

GLIBCXX(libstdc ++.so.6)与gcc版本之间的关系

[情况]

我正在开发一个c ++库.我的GLIBCXX版本有问题.

以前,我在版本机GLIBCXX_3.4.22上开发.

但是我的库没有处理具有GLIBCXX_3.4.19的目标机器.

因此,我将gcc版本从5.2.x降级到4.8.x,将GLIBCXX版本从3.4.22降级到3.4.19.

它成功运行在目标计算机上.

但我的开发机器(ubuntu)启动失败,因为其他库找不到已链接到该版本的GLIBCXX 3.4.22版本.

所以,我重新安装了GLIBCXX 3.4.22,但gcc版本仍为4.8.5.

[题]

  1. 我的库在gcc-4.8.5上编译不使用GLIBCXX_3.4.22版本吗?在这种环境下开发是否可以(gcc 4.8.5,GLIBCXX_3.4.22)?

  2. linux机器上的gcc(编译)版本和GLIBCXX(GLIBC)版本之间有什么关系.

  3. 在哪里可以检查gcc和GLIBCXX(GLIBC)之间的正确版本兼容性映射信息?

c++ linux gcc g++

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

linux内核系统调用服务例程的源代码在哪里?

我对系统调用(高级)工作流程的理解是:

  1. 用户调用 libc 包装器
  2. 包装器将系统调用号和参数放在正确的位置、寄存器或堆栈中
  3. 包装器执行 syscall 或 int 0x80 指令
  4. 内核中断处理程序调用 sys_xxx() 服务例程

如果是这样,那么内核源代码中应该有一堆 sys_xxx() 函数。例如,对于read(),在内核 2.6 代码中,我找到了sys_read。然而,在内核 5.4 代码中,我没有找到这样的服务例程代码,我发现的唯一sys_read就像是 libc 包装器的替代品。所以我很困惑..

一个相关的问题 - 内核将实现放在 sys_xxx() 中的原因是内核空间也可以调用这些函数,对吗?

c system-calls linux-kernel

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

为什么我们将链接器和加载器分成单独的程序

伙计们,我想为什么要将链接器和加载器编程分开?我的理解是链接器生成一个可重定位的代码,并且还构建了符号表,并提供了有关任何动态链接的lib的信息,并且加载器只是将可执行文件加载到内存中?为什么我们不能将它们合并?

谢谢

linker

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

linux:有没有办法找出哪个进程生成了核心文件?

我的系统中生成了一些核心文件,但这些核心文件的后缀只有时间戳,没有进程 ID 信息。

那么核心文件中是否有任何与进程ID相关的信息,以便我可以从gdb或其他工具中了解它?

c++ linux gdb process core

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

程序在无限循环中停止并给我分段错误

我目前正在学习c,我想创建一个播放器与播放器的井字游戏,但是当我执行程序时,总是会遇到分割错误。我正在使用gcc作为编译器。在main函数中有一个while(1)循环,但是它被忽略了。

这是我的代码:

#include <stdio.h>

int main(){
    int spieler, zug; 
    int board[9]={0,0,0,0,0,0,0,0,0};
    Pboard(board);
    spieler=0;
    while(1){
        if(spieler==0){
            board[(Pinput(spieler)-1)]='1'; //X
            spieler=1;
        } 
        else if(spieler==1){
            board[(Pinput(spieler)-1)]='2'; //O
            spieler=0;
        }
        Pboard(board);
        if(board[0]!=' ' && board[1]!=' ' && board[2]!=' ' && board[3]!=' ' && board[4]!=' ' && board[5]!=' ' && board[6]!=' ' && board[7]!=' ' && board[8]!=' '){
            break;
        }
    }
    return 0;
    }

Pboard(char board[9]){
    printf("\n");
    printf("\n");
    printf("\n");
    printf("   |   |\n");
    printf(" ");printf("%d", board[6]);printf(" | ");printf("%d", board[7]);printf(" | ");printf("%d", board[8]);printf("\n");
    printf("   |   |\n");
    printf("-----------\n");
    printf(" …
Run Code Online (Sandbox Code Playgroud)

c gcc segmentation-fault

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

为什么 GCC long long int 不能执行 1&lt;&lt;48 但会收到溢出警告

{
    unsigned long long two16, two48 ;
    two16 = 65536;
    two48 = two16 * two16 * two16 ; 
    printf("2^48=%llX \n",two48 );
    two48 = 1<<48 ;
    printf("Shifted 1<<48=%llX \n",two48);
    return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

当在 64 位机器上编译时,字大小为 8,上面给出警告 2=1<<48 将溢出左移计数 >= 类型宽度。

程序的输出是:

    2^48=1000000000000  
    Shifted 1<<48=0
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?为什么我不能将 64 位数量移至 48 位?

c integer-overflow gcc-warning

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