Ubuntu Can';无法理解针对';重新定位R#ux86_64_32s的意义;。数据';错误

Ubuntu Can';无法理解针对';重新定位R#ux86_64_32s的意义;。数据';错误,ubuntu,assembly,compilation,x86-64,relocation,Ubuntu,Assembly,Compilation,X86 64,Relocation,我最近开始为一个类分配任务,我试图实现我的程序,但我无法将其编译以进行测试。我不知道如何处理我得到的错误,也不知道它意味着什么 /usr/bin/ld: /tmp/ccPPQgOb.o: relocation R_X86_64_32S against `.data' can not be used when making a shared object; recompile with -fPIC Makefile:4: recipe for target 'cmix' fai

我最近开始为一个类分配任务,我试图实现我的程序,但我无法将其编译以进行测试。我不知道如何处理我得到的错误,也不知道它意味着什么

   /usr/bin/ld: /tmp/ccPPQgOb.o: relocation R_X86_64_32S against `.data' 
   can not be used when making a shared object; recompile with -fPIC
   Makefile:4: recipe for target 'cmix' failed
   /usr/bin/ld: final link failed: Nonrepresentable section on output
这是我的func.S文件,仍然缺少很多以后要实现的函数。switchBytes应切换一些字节,然后打印一个整数

.data
      format: .asciz "%d\n"
     .global printHigher, countOnes, lowerToUpper
     .text

.globl    switchBytes
.type    switchBytes, @function

switchBytes:
    mov $0xFF, %r12
    lea (,%rdi,8), %r13
    mov %r13b, %cl
    shl %cl, %r12
    andq %rdx,%r12
    mov %rsi, %r14
    subq %rdi,%r14 #y-x
    lea (,%r14,8), %r14
    mov %r14b,%cl
    shl %cl,%r12
    mov $0xFF, %r13
    lea (,%rsi,8), %r10
    mov %r10b, %cl
    shl %cl, %r13
    andq %rdx, %r13
    mov $0xFF, %r14
    lea (,%rdi,8), %r10
    mov %r10b, %cl
    shl %cl, %r14
    notq %r14
    andq %r14,%rdx
    mov $0xFF, %r15
    lea (,%rsi,8), %r10
    mov %r10b, %cl
    shl %cl, %r15
    notq %r15
    andq %r15,%rdx
    orq %r12,%rdx
    lea (,%rdi,8), %r10
    mov %r10b, %cl
    sar %cl, %r13
    orq %r13, %rdx
    mov $format, %rdi
    mov %rdx, %rsi
    mov $0, %eax
    call printf
    mov %rdx,%rax
    ret


printHigher:
        ret

countOnes:
        ret

lowerToUpper:
        ret
这是我的Makefile

all: cmix

cmix:
    $gcc cmix.c func.S -o cmix

clean:
    rm -f cmix.o cmix
    rm -f a.out
这是我的cmix.c(main)

#包括
#包括
#包括
#包括
#包括
无效开关字节(int,int,int)//rdi,rsi,rdx
void printHigher(无符号整数*,整数)//rdi,rsi
无效计数(int)//rdi
上下空隙(字符*)//rdi
intmain(intargc,char*argv[]){//main
char*opcion=argv[2];
int c,i;
int primerNum、segundnum、tercerNum;
while((c=getopt(argc,argv,o:)!=-1)
开关(c)
{
案例“o”:
如果(strcmp(“开关”,opcion)==0){
primerNum=atoi(argv[3]);
segundoNum=atoi(argv[4]);
tercerNum=atoi(argv[5]);
switchBytes(tercerNum、primerNum、segondnum);
出口(0);
}
否则如果(strcmp(“更高”,选项)==0){
无符号整数*数据;
数据=malloc(argc*4);
对于(int i=3;ii+1)
strsize++;
}
char*cmdstring;
cmdstring=malloc(strsize);
cmdstring[0]='\0';
对于(i=3;ii+1)
strcat(cmdstring,“”);
}
lowerToUpper(cmdstring);
出口(0);
}
否则{
printf(“残疾医生”);
打破
}
违约:
中止();
}
返回0;
}

mov$格式,%rdi
要求将地址作为符号扩展的32位链接时间常数(链接器填写的重新定位)。但是您正在使用默认情况下使位置独立的可执行文件的gcc进行构建(因此,即使是采用
movabs$格式的64位绝对地址,%rdi
也不起作用),有关使用
gcc-no pie-fno pie func.S cmix.c-Wall-O2-g
的详细信息,请参阅链接副本。(使用
-fPIC
重新编译的错误消息假定asm使用的绝对地址来自编译器)。顺便说一句,如果要使用绝对地址,使用5字节
mov$格式,%edi
指令将地址扩展为
rdi
,效率更高。小代码模型(如果使用
-无饼状图构建,则会得到该模型;它过去是默认值)确保所有标签都位于低2G虚拟地址空间中,因此符号或零扩展是安全的。
mov$格式,%rdi
要求将地址作为符号扩展的32位链接时间常数(一个
R_X86\u 64_32S
重定位将由链接器填写)。但您正在使用默认情况下使位置独立的可执行文件的gcc进行构建(因此,即使是采用
movabs$格式的64位绝对地址,%rdi
也无法工作),有关使用
gcc-no pie-fno pie func.S cmix.c-Wall-O2-g的详细信息,请参阅链接副本(使用
-fPIC
重新编译的错误消息假定asm使用的绝对地址来自编译器).BTW,如果要使用绝对地址,使用5字节
mov$格式,%edi
指令将地址零扩展到
rdi
。小代码模型(如果使用
-无饼状图构建,则会得到该模型;它过去是默认值)确保所有标签都在低2G的虚拟地址空间中,因此符号或零扩展是安全的。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>

void switchBytes(int, int, int); //rdi,rsi,rdx
void printHigher(unsigned int *, int); //rdi,rsi
void countOnes(int); //rdi
void lowerToUpper(char *); //rdi

int main(int argc, char *argv[]) { //main

 char *opcion = argv[2];
 int c,i;
 int primerNum,segundoNum,tercerNum;

 while ((c = getopt(argc, argv, "o:")) != -1)
        switch (c)
          {
          case 'o':
              if (strcmp("switch",opcion) == 0)  {
                  primerNum  = atoi(argv[3]);
                  segundoNum = atoi(argv[4]);
                  tercerNum  = atoi(argv[5]);

                 switchBytes(tercerNum,primerNum,segundoNum);
                  exit(0);
              }
              else if (strcmp("higher",opcion) == 0)  {

                  unsigned int* data;
                  data = malloc(argc*4);

                  for (int i = 3; i < argc; i++) {
                       data[(i-3)] = (unsigned int)atoi(argv[i]);
                   }

                   printHigher(data, argc-3);
                   exit(0);
              }
              else if (strcmp("count",opcion) == 0)  {
                    primerNum = atoi(argv[3]);
                    countOnes(primerNum);
                    exit(0);
               }
              else if (strcmp("l2u",opcion) == 0)  {
                      int strsize = 0;

                      for (i = 3; i < argc; i++) {
                          strsize += strlen(argv[i]);
                          if (argc > i+1)
                              strsize++;
                      }

                      char *cmdstring;
                      cmdstring = malloc(strsize); 
                      cmdstring[0] = '\0'; 

                          for (i = 3; i < argc; i++) {
                              strcat(cmdstring, argv[i]);
                              if (argc > i+1)
                                  strcat(cmdstring, " ");
                          }

                        lowerToUpper(cmdstring);
                        exit(0);
              }
              else {
                printf("Opcion Invalida\n");
                break;
              }
             default:
                 abort();
          }

return 0;
}