LoongArch-Documentation
LoongArch-Documentation copied to clipboard
New world的glibc符号问题
https://gitee.com/src-openeuler/glibc/blob/openEuler-22.03-LTS-LoongArch/0001-LoongArch-Port.patch#L6467 https://gitee.com/src-openeuler/glibc/blob/openEuler-22.03-LTS-LoongArch/0001-LoongArch-Port.patch#L10676
https://github.com/bminor/glibc/blob/glibc-2.36/sysdeps/unix/sysv/linux/loongarch/configure#L4 https://github.com/bminor/glibc/blob/glibc-2.36/sysdeps/unix/sysv/linux/loongarch/shlib-versions#L1
我发现龙芯贡献给euler的和上游的值不相符 这似乎会造成新世界发行版之间二进制不兼容吧
测试代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char * argv[]){
char *a = malloc(sizeof(char) *(2+1));
a[0] = 'H';
a[1] = 'i';
a[2] = 0;
char b[] = "Ho";
memcpy(a, b, 2);
printf("%s\n", a);
return 0;
}
在gentoo 上编译的结果 符号
0000000000007e30 a _DYNAMIC
0000000000008040 a _GLOBAL_OFFSET_TABLE_
0000000000000958 R _IO_stdin_used
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
00000000000006b0 a _PROCEDURE_LINKAGE_TABLE_
000000000000095c r __GNU_EH_FRAME_HDR
0000000000008040 d __TMC_END__
0000000000008088 B __bss_start
w __cxa_finalize@GLIBC_2.36
0000000000008080 d __dso_handle
U __libc_start_main@GLIBC_2.36
U __stack_chk_fail@GLIBC_2.36
U __stack_chk_guard@GLIBC_2.36
0000000000008088 D _edata
0000000000008090 B _end
0000000000000730 T _start
U abort@GLIBC_2.36
000000000000089c T main
U malloc@GLIBC_2.36
U puts@GLIBC_2.36
使用euler发行版运行结果
./a.out: /lib64/ld-linux-loongarch-lp64d.so.1: version `GLIBC_2.36' not found (required by ./a.out)
查看euler发行版libc符号
nm /lib64/libc.so.6 | grep 2.34
......
000000000008165c T timer_create@@GLIBC_2.34
00000000000818b4 T timer_delete@@GLIBC_2.34
00000000000819bc T timer_getoverrun@@GLIBC_2.34
0000000000081a00 T timer_gettime@@GLIBC_2.34
0000000000081a44 T timer_settime@@GLIBC_2.34
000000000004d798 T tmpfile@@GLIBC_2.34
000000000007f254 T tss_create@@GLIBC_2.34
000000000007f2b8 T tss_delete@@GLIBC_2.34
000000000007f2bc T tss_get@@GLIBC_2.34
000000000007f2c0 T tss_set@@GLIBC_2.34
这是因为 glibc 版本不同,正常现象。
这是因为 glibc 版本不同,正常现象。
实际上euler降低之后 失去互操作性 看起来直接改shlib-versions到 GLIBC_2.36 然后重新编译可能就行
上游不可能同意把符号版本改成 2.34 (我记得最早的一批 patch 因为这事遭到了批判),所以只能动 openEuler,建议在他们那边开 issue。