这是示例程序集文件,test.s
.global main
main:
mov __progname@GOT, %eax // failed to compile
mov __progname@GOT(%ebx), %eax //succeed to compile
我尝试用-pie
标志编译它,但失败了。
$ gcc -pie -o test test.s
osboxes@osboxes:/mnt/hgfs/VM_Shared/Reassemblabla/src$ gcc -pie -o test test.s
/usr/bin/ld: /tmp/ccPGMLlH.o: direct GOT relocation R_386_GOT32X against `__progname' without base register can not be used when making a shared object
/usr/bin/ld: failed to set dynamic section sizes: File format not recognized
collect2: error: ld returned 1 exit status
错误说,在 pie 二进制文件中,GOT
只能使用基址寄存器访问条目。
问题。
我不知道为什么编译器会像上面那样抱怨。
更具体地说,为什么__progname@GOT
pie 二进制文件不允许寻址?
我的意见。
Loader 知道__progname@GOT
pie 二进制文件在加载时的地址。
__progname@GOT
因此,加载程序可以简单地在加载时间的位置写入这个地址。
这就是装载机可以做的。
所以我不明白为什么编译器坚持像
mov __progname@GOT(%ebx), %eax
.