我想知道我们在这两种架构之间创建共享库的方式是否相同。
假设我有一个fx.c
包含一些函数定义的文件,所以我将创建一个如下共享库:
gcc -fPIC -c fx.c -o fx.o
gcc -shared fx.o -o libtest.so
这种创建共享库的方式在 x86_64 和 arm64 中是否相同?
以这种方式创建的共享库是否确实由不同的进程共享,并且只有一个副本驻留在内存中?
答案1
这种创建共享库的方式在 x86_64 和 arm64 中是否相同?
应该是一样的。
我推断这是https://www.gnu.org/software/make/manual/make.html#Implicit-Rules,并且主流构建系统似乎同意在两个平台上使用相同的参数调用该命令。在自动对许多目标进行交叉编译时尤其如此。当您想要使用名称不同或每个架构独有的某些标志时,高级用例可能会有所不同。
以这种方式创建的共享库是否确实由不同的进程共享,并且只有一个副本驻留在内存中?
在 Ubuntu 上确实如此。请参阅strace
并cat /proc/*/maps
了解非私有mmap
操作。
与评论所说的不同,这不是一个纯编程或内核问题。这取决于/lib/ld-linux.so
发行版附带的动态链接器 ()。假设发行版可以发布一个mmap
在 x86_64 上正确共享内存的动态链接器,但在 arm64 上发布一个可以共享内存的动态链接器memcpy
。但是发行版没有理由做出这样的选择,我也不知道有任何现有的选择。