使用gcc编译程序集:在创建共享对象时,不能使用针对`.text'的重定位R_X86_64_32S;用-fPIC重新编译

时间:2018-02-05 06:42:42

标签: c ubuntu gcc assembly x86-64

我正在尝试编写一个玩具示例作为家庭作业问题。我已经获得了一小段代码,但它不能在我的家用机器上编译(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的每个阶段)。有什么想法吗?

0 个答案:

没有答案