Перекомпиляция с -fPIC
применяется только в том случае, если asm был сгенерирован компилятором, а не написан вручную. Это не влияет на то, как asm собирается в машинный код.
Проблема в том, что ваш исполняемый файл PIE не может быть связан с 32-битными абсолютными адресами. (Вы хотели сделать ПИРОГ вместо статического зависимого от позиции исполняемого файла)?
Вам не нужны полные ресурсы совместно используемой библиотеки для ссылки на символы в другой библиотеке или главном исполняемом файле (например, ответ @ yugr показывает, как это сделать). Ваше автономное ядро может даже не иметь GOT или PLT, и определенно не должно использовать их для внутренних символов.
Единственное необходимое изменение - lea bar(%rip), %rdx
, REA-относительный LEA вместо mov $imm32, %r/m64
. (Movabs будет работать, но будет больше и, как правило, медленнее.)
Или, если вы действительно намеревались собрать с -static
и создать исполняемый файл, который будет загружен по фиксированному адресу в младших 32 битах адресного пространства, вы должны использовать mov $bar, %edx
, чтобы получить 5-байтовый mov $imm32, %r32
кодировка вместо 7-байтового mov $sign_extended_imm32, %r/m64
или 7-байтового LEA. См. Также Разница между movq и movabsq в x86-64