Problema de: relocation truncated to fit: R_X86_64_PC32

1. Problema de: relocation truncated to fit: R_X86_64_PC32

Apprentice X
ApprenticeX

(usa Slackware)

Enviado em 25/01/2022 - 00:44h

Boa Noite a Todos

Eu já peguei essa msg antes tentando compilar uma struct com muitos registros, porém não é exatamente esse caso atualmente.
Parece que o problema está sendo causado por qualquer coisa que seja adicionada a trabalhar com a struct.
Primeiro ela ficou limitada o que não achei muito bom, mas ignorei.
Ao implementar um qsort que meche com ela, mais uma vez o compilador recusa a compilar! Possivelmente pq esse qsort carrega ela em memória ficando duplamente mais pesada não sei.

Abaixo a forma que compilei e as msgs de erros
g++ tests.cpp -o tests -lfltk -lfltk_images -O3 -Wall -pedantic -pedantic-errors -Werror

/tmp/cclei9UG.o: in function `Check_Password()':
tests.cpp:(.text+0x297): relocation truncated to fit: R_X86_64_PC32 against symbol `Icon' defined in .bss section in /tmp/cclei9UG.o
tests.cpp:(.text+0x2c2): relocation truncated to fit: R_X86_64_PC32 against symbol `Icon' defined in .bss section in /tmp/cclei9UG.o
tests.cpp:(.text+0x3df): relocation truncated to fit: R_X86_64_PC32 against symbol `ThemeBtBackground' defined in .bss section in /tmp/cclei9UG.o
tests.cpp:(.text+0x3ea): relocation truncated to fit: R_X86_64_PC32 against symbol `ThemeBtSelected' defined in .bss section in /tmp/cclei9UG.o
tests.cpp:(.text+0x3ff): relocation truncated to fit: R_X86_64_PC32 against symbol `ThemeBtLabelColor' defined in .bss section in /tmp/cclei9UG.o
/tmp/cclei9UG.o: in function `Config_System()':
tests.cpp:(.text+0x12ee): relocation truncated to fit: R_X86_64_PC32 against symbol `Icon' defined in .bss section in /tmp/cclei9UG.o
tests.cpp:(.text+0x140b): relocation truncated to fit: R_X86_64_PC32 against symbol `ThemeBtBackground' defined in .bss section in /tmp/cclei9UG.o
tests.cpp:(.text+0x1416): relocation truncated to fit: R_X86_64_PC32 against symbol `ThemeBtSelected' defined in .bss section in /tmp/cclei9UG.o
tests.cpp:(.text+0x143c): relocation truncated to fit: R_X86_64_PC32 against symbol `ThemeBtLabelColor' defined in .bss section in /tmp/cclei9UG.o
/tmp/cclei9UG.o: in function `Class_WinPassword::~Class_WinPassword()':
tests.cpp:(.text._ZN17Class_WinPasswordD2Ev[_ZN17Class_WinPasswordD5Ev]+0x9): relocation truncated to fit: R_X86_64_PC32 against symbol `Password' defined in .bss section in /tmp/cclei9UG.o
/tmp/cclei9UG.o: in function `Class_Grid::draw_cell(Fl_Table::TableContext, int, int, int, int, int, int)':
tests.cpp:(.text._ZN10Class_Grid9draw_cellEN8Fl_Table12TableContextEiiiiii[_ZN10Class_Grid9draw_cellEN8Fl_Table12TableContextEiiiiii]+0x53): additional relocation overflows omitted from the output
collect2: error: ld returned 1 exit status

Inclui aqui -fPIC
g++ tests.cpp -o tests -fPIC -lfltk -lfltk_images -O3 -Wall -pedantic -pedantic-errors -Werror

/usr/bin/ld: failed to convert GOTPCREL relocation; relink with --no-relax
collect2: error: ld returned 1 exit status

Compilou somente com -mcmodel=medium
g++ tests.cpp -o tests -mcmodel=medium -lfltk -lfltk_images -O3 -Wall -pedantic -pedantic-errors -Werror 

O Problema que não faço idéia do que são essas inclusões ao compilador e se isso é bom ou ruim. Esses comandos encontrei na Internet mas tive dificuldade de entendê-los, o pouco que entendi foi de que eram para liberar mais memória para o programa, mas li que isso afetaria o desempenho do sistema e coisas assim, fiquei confuso!

Também consegui entender que isso tem a ver com a struct visto que declaro ela com campos fixos e qtd de registros fixos. E seria tipo 5 mil registros para quase 10 campos de 200 mil caracteres, em uma pergunta anterior o SamL chegou a explicar o problema da Qtd de memória necessária pra isso e eu entendi, mas a questão é porque então posso compilar usando -mcmodel=medium sem problemas?

Gostaria de entender melhor sobre isso, pq por enquanto isso são apenas testes, mas terei que decidir se usarei por alguns momentos assim mesmo, ou se implantarei um sistema de leitura e navegação direta de um arquivo (parecido com fwrite) e dessa forma não alocando tanta memória. Não gostaria de usar nenhuma solução pronta como SQL, pq meu objetivo é fazer eu mesmo pra entender como tudo isso funciona

Gostaria de saber exatamente o que estou fazendo e o que esse comando -mcmodel=medium passa a significar pro meu código. De fato não consegui entender muito a informação dele o que isso muda: https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
Generate code for the medium model: the program is linked in the lower 2 GB of the address space. Small symbols are also placed there. Symbols with sizes larger than -mlarge-data-threshold are put into large data or BSS sections and can be located above 2GB. Programs can be statically or dynamically linked.

Esse código é em C++ pq usa bibliotecas FLTK, usei o qsort no lugar do std::sort pq estou testando ele
Obrigado!