为什么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物体是否有什么特别的东西。。。