C compiling: relocation truncated to fit R_X86_64_PC32 against symbol

跟風遠走 提交于 2021-02-08 07:42:34

问题


/* my program
   author/date:  me/now
*/

# include <stdio.h>

# define XX    1000
# define YY    20000       /* value of 1000 is ok */
# define ZZ    6000

/* global variable declaration */

int some_variable_this;
int some_variable_that;
double data[XX][YY][ZZ];

static void some_procedure_this ( void )
{
}

static void some_procedure_that ( void )
{
}

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

writing a quick C program to reformat some data. when compiling via gcc myprogram.c if I make the global data array too large I get the compiler error:

relocation truncated to fit R_X86_64_PC32 against symbol 'some_variable_this'
relocation truncated to fit R_X86_64_PC32 against symbol 'some_variable_that'

My goal is to do a quick c code to reformat some data.

  • What does this R_X86_64_PC32 mean?
  • Is there a compiler flag I can used to get around this?
  • Is there a better way to code this, in C, while still maintaining quickness of writing the code and simplicity for human readability?

this on gcc 4.3.4 in linux if it matters.


回答1:


  • What does this R_X86_64_PC32 mean?

It is an ELF relocation type used in ELF for x86_64. This particular type expresses that the location of the referenced data is computed based on a 32-bit offset from the an address related to the program counter. I interpret the diagnostics to indicate that the needed offsets are too large to fit in the provided 32 bits, which means that the compiler generated code that, in practice, the linker wasn't able to link correctly.

  • Is there a compiler flag I can used to get around this?

Maybe. The basic problem is that you've defined an object that is larger than the authors of your compiler imagined (at the time) that anyone would be able to accommodate. You're going beyond its design limits.

There may be options that would mitigate this effect. In particular, you could try twiddling the -fPIC and / or -fPIE options, and there may be others.

  • Is there a better way to code this, in C, while still maintaining quickness of writing the code and simplicity for human readability?

It's not a C problem per se, it's an implementation problem. Yet GCC is not wrong or faulty here as far as the language standard is concerned -- the standard does not obligate implementations to accept every possible program that is technically valid.

With that said, you could also try moving the declarations of some_variable_this and some_variable_that after the declaration of data. Conceivably, it might also help to declare those variables static, or to move them (or data) to a separate shared library.



来源:https://stackoverflow.com/questions/57331990/c-compiling-relocation-truncated-to-fit-r-x86-64-pc32-against-symbol

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!