ELF переехать против местной секции - PullRequest
1 голос
/ 27 июля 2011

Я пытаюсь создать свои собственные файлы ELO .o, в которые я хочу записать полосы памяти, которые указывают на другие полосы памяти. Я не хочу давать каждой полосе имя, поэтому я просто отслеживаю их положение относительно начала секции, в которой они находятся.

Итак, я создаю запись о перемещении в виде:

000000000a50 00090000000b R_X86_64_32S 0000000000000000 .section + a70

где на a50 мы ссылаемся на объект в .section + a70, используя 64-битный глобальный указатель. Раздел определяется с помощью:

9: 0000000000000000 0 SECTION LOCAL DEFAULT 6

Предыдущий вывод от readelf, и он фактически делает вид, что все в порядке ... пока я не потяну это через LD, который просто segfaults.

Я обнаружил, что если я использую тип WEAK, он работает ... но похоже, что он использует первый символ раздела, который находит во всех связанных файлах .o, в качестве цели для ВСЕХ перемещений в этом случае. Я действительно хочу, чтобы он был локальным, поэтому ЛОКАЛЬНЫМ он должен быть.

Альтернативой, которую я имею до сих пор, является просто создание символа OBJECT в начале каждого раздела, в котором есть такие объекты, но это просто кажется глупым ... Я что-то не так делаю, или в LD есть ошибка?

1 Ответ

1 голос
/ 28 июля 2011

Очевидно, у меня было смещение на 1 в поле sh_info таблицы символов. Я понял это с помощью GOLD, который немного более информативен не только с помощью segfaulting, но и дает:


    gold: internal error in do_layout, at ../../gold/object.cc:1493

или


    gold: error: invalid STB_LOCAL symbol in external symbols
    gold: error: unsupported symbol binding 0
    gold: error: invalid STB_LOCAL symbol in external symbols
    gold: error: unsupported symbol binding 0
    gold: error: test.o: multiple definition of ''
    gold: test.o: previous definition here

Это помогло мне определить, что мои локальные символы оказались во «внешних символах» (то есть после «индекса первого нелокального символа», сохраненного в sh_info)

...