我正在尝试编写一个玩具示例作为家庭作业问题。我已经获得了一小段代码,但它不能在我的家用机器上编译(Ubuntu 17,gcc 7.2.0)。完全相同的代码在学校机器上编译(Ubuntu 16,gcc 5.4.1)。
当我运行make时,我收到以下错误:
/ usr / bin / ld:age.o:在创建共享对象时,不能使用针对`.text'的重定位R_X86_64_32S;用-fPIC重新编译
/ usr / bin / ld:最终链接失败:输出中不可代表的部分
collect2:错误:ld返回1退出状态
使用-fPIC标志进行编译无法解决问题。
以下是示例汇编代码:
.string1:
.string "Please enter your name: "
.string2:
.string "Thank you %s!\n"
.string3:
.string "Please enter your year of birth: "
.globl get_age
get_age:
push %rbx
push %rbp # callee saved registers
# local variables:
leaq -8(%rsp), %rsp # - endptr
leaq -24(%rsp), %rsp # - name_str[24]
leaq -24(%rsp), %rsp # - year_of_birth[24]
mov %rsp, %rbp
movq $.string1, %rdi
xorl %eax, %eax
call printf # printf("Please enter your name: ");
leaq 24(%rbp), %rdi
call gets # gets(name_str);
ret
这个代码是从一个简单的主函数调用的:
#include <stdio.h>
long get_age(void);
void main () {
long age;
age = get_age();
printf("You are at least %ld years old.\n", age);
return;
printf("You are at least %ld years old and you look like it too.\n", age);
}
这是我正在使用的makefile。请注意,调用 gcc -o x age.o main.o 时会发生故障:
all: x
x: main.o age.o
gcc -o x age.o main.o
main.o: main.s
gcc -c main.s
age.o: age.s
gcc -g -c age.s
main.s: main.c
gcc -O2 -S main.c
clean:
rm -f x *.o main.s
如前所述,-fPIC标志似乎没有任何区别(我已经尝试将它添加到makefile的每个阶段)。有什么想法吗?