Avatar ·

O que é a flag -fPIC no GCC e por que ela é necessária ao compilar bibliotecas?

Olá a todos! Comecei a estudar C++ e estou tentando compilar uma biblioteca dinâmica (.so) no Linux usando GCC. Vejo em todos os lugares que ao compilar objetos para a biblioteca adicionam a flag -fPIC, mas não entendo por que ela é necessária. Aqui está meu exemplo simples. Tenho o arquivo `math_utils.cpp`: ```cpp int add(int a, int b) { return a + b; } int multiply(int a, int b) { return a * b; } ``` Eu compilo assim: ```bash g++ -c math_utils.cpp -o math_utils.o g++ -shared math_utils.o -o libmath.so ``` E funciona! A biblioteca é criada, o programa a carrega e usa as funções. Mas se eu adicionar -fPIC: ```bash g++ -c -fPIC math_utils.cpp -o math_utils.o ``` O resultado é o mesmo. Qual é a diferença? Quando pesquisei, dizem que sem -fPIC no x86_64 pode dar erro, mas aqui tudo compila. Expliquem, por favor, o que é Position Independent Code, e é obrigatório usar -fPIC para shared libraries? Existem casos em que não dá para evitar? Desde já agradeço! <<>>

O que é