【问题标题】:program not running due to problems in linking由于链接问题,程序无法运行
【发布时间】:2023-03-09 18:38:01
【问题描述】:

我在执行二进制文件时遇到了麻烦。程序收到分段错误。 过滤是gdb的输出

gdb a.out

(gdb) run
Starting program: a.out

Program received signal SIGSEGV, Segmentation fault.
0x00000001 in ?? ()
(gdb)

然后我使用了 nm 实用程序

nm -u a.out
      U Allocatememory

我发现许多符号未定义。这个 a.out 二进制文件实际上是通过链接许多其他 .so 获得的。 我在其中一个.so上做了nm

nm libmylib.so
00000000000de6f  T Allocate memory

程序与上面的 libmylib.so 链接。在链接过程中我没有收到任何错误。

g++ -m32  -shared -Wl -o a.out -lmylib 

但是,如果没有 -shared 选项,我会收到以下错误

/usr/bin/ld: <path_to_bin>/a.out: hidden symbol `__dso_handle' in 
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/32/crtbegin.o is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
*** Error code 1

可能是什么问题?有人可以建议我如何解决这个问题吗? 提前致谢

【问题讨论】:

    标签: segmentation-fault undefined-symbol nm


    【解决方案1】:

    g++ -m32 -shared -Wl -o a.out -lmylib

    这将构建一个名为a.out 的共享库。不要那样做:共享库不能直接执行。

    你会想要这样做:

    g++ -m32 main.cc -o a.out -lmylib
    

    其中main.cc 包含实际的main 函数。

    【讨论】:

    • 我实际上收到以下错误 /usr/bin/ld: : hidden symbol `__dso_handle' in /usr/lib/gcc/x86_64-redhat-linux/4.1 .2/32/crtbegin.o 被 DSO /usr/bin/ld 引用:最终链接失败:输出 collect2 上的不可表示部分:ld 返回 1 个退出状态
    • @prabhu 请使用您正在使用的确切命令更新您的问题,而不是将其他信息放入 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2021-09-21
    • 2018-08-25
    • 2021-08-29
    • 2020-04-19
    • 1970-01-01
    相关资源
    最近更新 更多