为什么nm报告错误,库中变量的符号偏移值太大,由C编写并嵌入在golang对象上?
我有一个库,其中包含以下变量:为什么nm报告错误,库中变量的符号偏移值太大,由C编写并嵌入在golang对象上?,c,go,cgo,nm,C,Go,Cgo,Nm,我有一个库,其中包含以下变量: const static volatile int64_t head1 = 0xffffffffffffffff; const static volatile int64_t head2 = 0xffffffffffffffff; const static volatile int64_t seed = 1; const static volatile int64_t tail1 = 0xffffffffffffffff; const stat
const static volatile int64_t head1 = 0xffffffffffffffff;
const static volatile int64_t head2 = 0xffffffffffffffff;
const static volatile int64_t seed = 1;
const static volatile int64_t tail1 = 0xffffffffffffffff;
const static volatile int64_t tail2 = 0xffffffffffffffff;
我已经把它编译成libnantoka.a的库文件。然后通过cgo链接到go模块,如下所示:
/*
#cgo LDFLAGS: -L. -lssl -lcrypto -lpthread -ldl -lm -lnantoka
#include <nantoka.h>
#include <stdbool.h>
*/
import "C"
od -A x -x main | grep "0001 0000 0000 0000"
0d61f0 ffff ffff ffff ffff 0001 0000 0000 0000
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 00000019 00010174 00010174 00000174 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 00010190 00010190 00000190 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .note.go.buildid 00000064 000101b0 000101b0 000001b0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .note.gnu.build-id 00000024 00010214 00010214 00000214 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .gnu.hash 00000568 00010238 00010238 00000238 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .dynsym 00000b70 000107a0 000107a0 000007a0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .dynstr 00000974 00011310 00011310 00001310 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .gnu.version 0000016e 00011c84 00011c84 00001c84 2**1
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .gnu.version_r 000000a0 00011df4 00011df4 00001df4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .rel.dyn 00000020 00011e94 00011e94 00001e94 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 .rel.plt 00000368 00011eb4 00011eb4 00001eb4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
11 .init 0000000c 0001221c 0001221c 0000221c 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .plt 00000530 00012228 00012228 00002228 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .text 00094338 00012758 00012758 00002758 2**3
CONTENTS, ALLOC, LOAD, READONLY, CODE
14 .fini 00000008 000a6a90 000a6a90 00096a90 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
15 .rodata 0004001c 000a6a98 000a6a98 00096a98 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
16 .typelink 00000cfc 000e6ab8 000e6ab8 000d6ab8 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
17 .itablink 0000002c 000e77b4 000e77b4 000d77b4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
18 .gopclntab 0005fd79 000e77e0 000e77e0 000d77e0 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
19 .ARM.exidx 00000008 0014755c 0014755c 0013755c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
20 .eh_frame 00000004 00147564 00147564 00137564 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
21 .tbss 00000008 00157ee8 00157ee8 00137ee8 2**2
ALLOC, THREAD_LOCAL
似乎符号种子的偏移地址可能是0xd61f8。此外,我已确定如下:
/*
#cgo LDFLAGS: -L. -lssl -lcrypto -lpthread -ldl -lm -lnantoka
#include <nantoka.h>
#include <stdbool.h>
*/
import "C"
od -A x -x main | grep "0001 0000 0000 0000"
0d61f0 ffff ffff ffff ffff 0001 0000 0000 0000
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 00000019 00010174 00010174 00000174 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 00010190 00010190 00000190 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .note.go.buildid 00000064 000101b0 000101b0 000001b0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .note.gnu.build-id 00000024 00010214 00010214 00000214 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .gnu.hash 00000568 00010238 00010238 00000238 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .dynsym 00000b70 000107a0 000107a0 000007a0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .dynstr 00000974 00011310 00011310 00001310 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .gnu.version 0000016e 00011c84 00011c84 00001c84 2**1
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .gnu.version_r 000000a0 00011df4 00011df4 00001df4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .rel.dyn 00000020 00011e94 00011e94 00001e94 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 .rel.plt 00000368 00011eb4 00011eb4 00001eb4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
11 .init 0000000c 0001221c 0001221c 0000221c 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .plt 00000530 00012228 00012228 00002228 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .text 00094338 00012758 00012758 00002758 2**3
CONTENTS, ALLOC, LOAD, READONLY, CODE
14 .fini 00000008 000a6a90 000a6a90 00096a90 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
15 .rodata 0004001c 000a6a98 000a6a98 00096a98 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
16 .typelink 00000cfc 000e6ab8 000e6ab8 000d6ab8 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
17 .itablink 0000002c 000e77b4 000e77b4 000d77b4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
18 .gopclntab 0005fd79 000e77e0 000e77e0 000d77e0 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
19 .ARM.exidx 00000008 0014755c 0014755c 0013755c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
20 .eh_frame 00000004 00147564 00147564 00137564 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
21 .tbss 00000008 00157ee8 00157ee8 00137ee8 2**2
ALLOC, THREAD_LOCAL
od-A x-x-j 0xd61e0主|封头-n4
0d61e0 7472000A 0000 ffff ffff ffff
0d61f0 ffff ffff ffff 0001 0000 0000
0d6200 ffff ffff ffff ffff ffff ffff ffff ffff
0d6210 3130 3332 3534 3736 3938 3130 3332 3534
它表示0xd61f8必须是值为1的64位整数,介于128位“f”之间。我确信符号种子的偏移地址必须0xd61f8
但是,nm的结果令人惊讶地是:
nm main | grep seed
000e61f8 r seed
结果e61f8必须是从.rodata段开始的偏移地址,但大于从文件顶部的实际偏移地址
我搞不懂为什么nm报告的偏移量如此之大?我真的很感谢你的任何建议!多谢各位
顺便说一下,环境是Raspberry Pi模型B,go版本是1.13.5,如下所示:
/*
#cgo LDFLAGS: -L. -lssl -lcrypto -lpthread -ldl -lm -lnantoka
#include <nantoka.h>
#include <stdbool.h>
*/
import "C"
od -A x -x main | grep "0001 0000 0000 0000"
0d61f0 ffff ffff ffff ffff 0001 0000 0000 0000
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 00000019 00010174 00010174 00000174 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 00010190 00010190 00000190 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .note.go.buildid 00000064 000101b0 000101b0 000001b0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .note.gnu.build-id 00000024 00010214 00010214 00000214 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .gnu.hash 00000568 00010238 00010238 00000238 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .dynsym 00000b70 000107a0 000107a0 000007a0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .dynstr 00000974 00011310 00011310 00001310 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .gnu.version 0000016e 00011c84 00011c84 00001c84 2**1
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .gnu.version_r 000000a0 00011df4 00011df4 00001df4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .rel.dyn 00000020 00011e94 00011e94 00001e94 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 .rel.plt 00000368 00011eb4 00011eb4 00001eb4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
11 .init 0000000c 0001221c 0001221c 0000221c 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .plt 00000530 00012228 00012228 00002228 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .text 00094338 00012758 00012758 00002758 2**3
CONTENTS, ALLOC, LOAD, READONLY, CODE
14 .fini 00000008 000a6a90 000a6a90 00096a90 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
15 .rodata 0004001c 000a6a98 000a6a98 00096a98 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
16 .typelink 00000cfc 000e6ab8 000e6ab8 000d6ab8 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
17 .itablink 0000002c 000e77b4 000e77b4 000d77b4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
18 .gopclntab 0005fd79 000e77e0 000e77e0 000d77e0 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
19 .ARM.exidx 00000008 0014755c 0014755c 0013755c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
20 .eh_frame 00000004 00147564 00147564 00137564 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
21 .tbss 00000008 00157ee8 00157ee8 00137ee8 2**2
ALLOC, THREAD_LOCAL
uname-a
Linux raspberrypi 4.19.50+#896周四6月20日16:09:52英国夏令时2019 armv6l GNU/Linux
围棋版
go版本go1.13.5 linux/arm
此外,主要部分的信息如下:
/*
#cgo LDFLAGS: -L. -lssl -lcrypto -lpthread -ldl -lm -lnantoka
#include <nantoka.h>
#include <stdbool.h>
*/
import "C"
od -A x -x main | grep "0001 0000 0000 0000"
0d61f0 ffff ffff ffff ffff 0001 0000 0000 0000
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 00000019 00010174 00010174 00000174 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 00010190 00010190 00000190 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .note.go.buildid 00000064 000101b0 000101b0 000001b0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .note.gnu.build-id 00000024 00010214 00010214 00000214 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .gnu.hash 00000568 00010238 00010238 00000238 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .dynsym 00000b70 000107a0 000107a0 000007a0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .dynstr 00000974 00011310 00011310 00001310 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .gnu.version 0000016e 00011c84 00011c84 00001c84 2**1
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .gnu.version_r 000000a0 00011df4 00011df4 00001df4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .rel.dyn 00000020 00011e94 00011e94 00001e94 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 .rel.plt 00000368 00011eb4 00011eb4 00001eb4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
11 .init 0000000c 0001221c 0001221c 0000221c 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .plt 00000530 00012228 00012228 00002228 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .text 00094338 00012758 00012758 00002758 2**3
CONTENTS, ALLOC, LOAD, READONLY, CODE
14 .fini 00000008 000a6a90 000a6a90 00096a90 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
15 .rodata 0004001c 000a6a98 000a6a98 00096a98 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
16 .typelink 00000cfc 000e6ab8 000e6ab8 000d6ab8 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
17 .itablink 0000002c 000e77b4 000e77b4 000d77b4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
18 .gopclntab 0005fd79 000e77e0 000e77e0 000d77e0 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
19 .ARM.exidx 00000008 0014755c 0014755c 0013755c 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
20 .eh_frame 00000004 00147564 00147564 00137564 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
21 .tbss 00000008 00157ee8 00157ee8 00137ee8 2**2
ALLOC, THREAD_LOCAL
我不确定这是否是一个dup,但我认为-在加载程序时,可能会有一些加载地址重新映射。也可能有答案吗?谢谢Ken Y-N。由C编写的原始libnantoka.o的nm结果显示了正确的偏移量。我想知道golang对象是否有特殊的功能…我不确定这是否是dup,但我认为-加载程序时,可能会有一些加载地址重新映射。也可能有答案吗?谢谢Ken Y-N。由C编写的原始libnantoka.o的nm结果显示了正确的偏移量。我想知道golang物体是否有什么特别的东西。。。