52得票2回答
为什么GCC根据文件创建共享对象而不是可执行二进制文件?

我正在构建一个库。当我在Makefile中运行以下任意一条命令时:ar rcs lib/libryftts.a $^或者gcc -shared $^ -o lib/libryftts.so,我的所有对象都会成功编译和链接。我还能够将它们成功安装到/usr/local/lib目录下。当我使用nm...

23得票1回答
ARM汇编中ADRP和ADRL指令的语义是什么?

ADRP ADRP指令可以得到PC地址加上一个偏移量所在的4KB页的地址。 ADRL ADRL指令将PC相对地址加载进寄存器中。它类似于ADR指令。与ADR不同的是,ADRL可以加载更广泛的地址范围,因为它生成两个数据处理指令。 具体来说, ADRL汇编成两个指...

10得票1回答
STM32,位置无关代码-函数指针不在GOT中?

我需要一个在STM32F401上工作的位置独立代码(PIC)。但是我在指向结构体中使用的函数指针方面遇到了问题。 简单示例: struct process { struct process *next; const char *name; PT_THREAD((* thread...

8得票2回答
如何强制gcc在PIC代码中直接调用函数?

考虑以下函数: extern void test1(void); extern void test2(void) { test1(); } 在amd64 Linux上,如果没有使用-fpic,gcc生成的代码如下: test2: jmp test1 当我使用-fpi...

8得票2回答
两个进程如何共享同一个共享库?

我一直在努力理解共享库的工作原理,但有两个问题让我无法理解。 1- 每个进程都有自己的虚拟内存空间和页表,所以如果一个共享库被加载到一个进程的虚拟内存空间中,那么第二个进程如何访问该共享库,因为它不在其内存空间中? 2- 我知道只有文本部分是共享的,而全局数据不是,这是怎么可能的?我的理解...

7得票1回答
为什么我不能使用-fPIE编译,但可以使用-fPIC?

我有一个有趣的编译问题。 首先,请查看要编译的代码。 $ ls Makefile main.c sub.c sub.h $ gcc -v ... gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ## Makefile %.o: CF...