Средой является Solaris на 32-битной SPARC, но я думаю, что это более общая проблема с динамическим связыванием и / или позиционно-независимым кодом.
У меня есть программа сборки, которую я компилирую как независимый от позиции код и динамически связываю его с программой на Си. Он работает нормально, за исключением того, что я не могу сослаться на любую память, зарезервированную программой сборки из программы сборки. Прыжки внутри программы сборки работают нормально.
Я просто хочу читать и записывать в память в программе сборки, но всякий раз, когда я пытаюсь это сделать, я получаю ошибку сегментации.
Я написал эту тестовую программу для устранения этой проблемы
.section ".data"
.global foo
foo: .word 1
.section ".text"
.global testprog
testprog:
save %sp, -(92+4), %sp
sethi %hi(foo), %o0 ! set foo, %o0
or %o0, %lo(foo), %o0
call print_int
nop
ret
restore
Я компилирую это с
as -K PIC -b
и добавьте получившийся .so в C
dlhandle = dlopen(obj_file, RTLD_NOW)
dl_testprog = dlsym(dlhandle, "testprog")
когда я звоню dl_testprog()
, он печатает "4". Он также печатает «4», если я пытаюсь напечатать адрес testprog или print_int. Переход на метку и все остальное работает просто отлично. Глядя на разборку, foo заменяется на 0x0, как и должно быть.
Должен ли я пройти через _GLOBAL_OFFSET_TABLE_
или что-то еще, чтобы иметь возможность писать в свою память в программе сборки? Если да, то как мне это сделать? Все, что я пробовал, привело к segfault, и я не смог найти очень хорошее руководство, как это сделать (что заставляет меня поверить, что вы не должны этого делать. Разве это не проблема с линкерами?) .