加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

unix – Gold无法从静态库创建可重定位目标文件

发布时间:2020-12-15 20:55:04 所属栏目:安全 来源:网络整理
导读:让我先说一下,我是一个与接头有关的事情的菜鸟.如果我说的话似乎没有意义,那可能不会 – 请打电话给我. 我有以下文件: 酒吧 #[no_mangle]pub extern fn bar(x: isize) - isize { x + 1 } foo.c extern int bar(int);extern int baz(int);int foo(int x) { r
让我先说一下,我是一个与接头有关的事情的菜鸟.如果我说的话似乎没有意义,那可能不会 – 请打电话给我.

我有以下文件:

>酒吧

#[no_mangle]
pub extern fn bar(x: isize) -> isize { x + 1 }

> foo.c

extern int bar(int);
extern int baz(int);
int foo(int x) { return bar(x) + baz(x); }

我可以将这些链接到一个可重定位目标文件中:

$rustc --crate-type=staticlib bar.rs -o bar.a
$gcc -c foo.c -o foo.o
$ld -r foo.o bar.a -o out.o

我不确定引擎盖下发生了什么,但我确实得到了我想要的输出:bar和foo是定义而baz不是.

$nm out.o | grep '(foo|bar|baz)$'
0000000000000000 T bar
                 U baz
0000000000000000 T foo

如果我用ld.bfd替换ld,就会发生同样的事情.然而,事情与ld.gold分道扬..

$ld.gold -r foo.o bar.a -o out.o
ld.gold: internal error in set_info_section,at ../../gold/output.h:3198

这与ld.gold和binutils 2.24和2.26一起打包.

binutils 2.30仍存在问题,尽管我获得的行号不同:

$ld.gold -r foo.o bar.a -o out.o
ld.gold: internal error in set_info_section,at ../../gold/output.h:3386

此外,即使使用–emit = obj而不是–crate-type = staticlib,错误仍然存??在

所以:

>错误是什么意思?
>如何使用ld.gold和ld和ld.bfd实现与ld.gold相同的可重定位目标输出?

解决方法

Reported here.事实证明这已经在trunk中修复了,所以我想解决方案是等到binutils 2.31(或从头开始构建binutils).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读