我有以下简短的应用程序(原文取自:https://www.aldeid.com/wiki/X86-assembly/Instructions/str),我刚刚对其进行了修改(尝试...),使其也可以在linux上编译。
#include <stdio.h>
unsigned char mema[4] = {0,0};
void test4 (void)
{
asm (
"str mema\n"
);
printf ("\n[+] Test 4: STR\n");
printf ("STR base: 0x%02x%02x%02x%02x\n",mema[0],mema[1],mema[2],mema[3]);
if ((mema[0] == 0x00) && (mema[1] == 0x40))
printf ("Result : VMware detected\n\n");
else
printf ("Result : Native OS\n\n");
}
int main () {
test4();
}
当我尝试编译它时:
$ gcc -ggdb -O0 -fPIC -x c ./pill.c -o pill
它给了我一个奇怪的错误:
/usr/bin/ld: /tmp/ccdhGo05.o: relocation R_X86_64_32S against symbol `mema' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
然而,同样的事情也适用于在线编译器:https://gcc.godbolt.org/z/RYWjy8
...,除非当我抱怨变量mema
在函数test4
中成为局部变量
undefined symbol `mema'
还有另一个怪异之处:使用clang编译时,相同的东西也可以工作。
知道为什么会这样吗? (没有考虑STR
和其他事物所需的特权级别,我只对链接错误感兴趣,为什么链接错误在一个系统/编译器而不是另一个系统/编译器上起作用。