Как компоновщик разрешает символ в ассемблерном коде

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat Пример: использование локалей

В этом примере показаны некоторые из вариации в локализованных числовых форматах. Чтобы получить формат языка, используемого в пользовательском интерфейсе вашего приложения, обязательно укажите этот язык (и, возможно, некоторые запасные языки), используя аргумент locales:

var number = 123456.789;

// Немецкий язык использует запятую в качестве десятичного разделителя и точку для тысяч console.log (new Intl.NumberFormat ('de-DE'). Format (number)); // → 123.456,789

// В большинстве говорящих на арабском языке арабских языков используются настоящие арабские цифры console.log (new Intl.NumberFormat ('ar-EG'). Format (number)); // → ١٢٣٤٥٦ ٫ ٧٨٩

// Индия использует разделители тысяч / лакх / крор console.log (новый Intl.NumberFormat ('en-IN'). Format (number));

8
задан starblue 17 October 2009 в 20:07
поделиться

4 ответа

Предполагая формат файла ELF, ассемблер сгенерирует неопределенную ссылку на символ в объектном файле. Это будет выглядеть так:

Symbol table '.symtab' contains 11 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000000     0 FILE    LOCAL  DEFAULT  ABS test.c
     2: 00000000     0 SECTION LOCAL  DEFAULT    1
     3: 00000000     0 SECTION LOCAL  DEFAULT    3
     4: 00000000     0 SECTION LOCAL  DEFAULT    4
     5: 00000000     0 SECTION LOCAL  DEFAULT    5
     6: 00000000     0 SECTION LOCAL  DEFAULT    6
     7: 00000000     0 SECTION LOCAL  DEFAULT    7
     8: 00000000    52 FUNC    GLOBAL DEFAULT    1 main
     9: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND printf
    10: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND exit

Он также создаст запись о перемещении, чтобы указать на часть изображения кода, которая должна быть обновлена ​​компоновщиком с правильным адресом. Это будет выглядеть так:

tool2 0>readelf -r test.o

Relocation section '.rel.text' at offset 0x358 contains 3 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
0000001f  00000501 R_386_32          00000000   .rodata
00000024  00000902 R_386_PC32        00000000   printf
00000030  00000a02 R_386_PC32        00000000   exit

Затем работа компоновщика состоит в том, чтобы пройти по таблице перемещений, исправляя изображение кода с окончательными адресами символов.

Есть отличная книга, но я не могу найти подробностей прямо сейчас (и это не издается). Однако, похоже, это может быть полезно: http://www.linuxjournal.com/article/6463

Дэйв.

17
ответ дан 5 December 2019 в 08:25
поделиться

Отличную книгу о процессе связывания см. В Linkers & Loaders Джона Левина. Вы можете получить главы рукописи в формате HTML здесь .

1
ответ дан 5 December 2019 в 08:25
поделиться

Еще один хороший ресурс по линкерам - это серия статей: http://www.google.fr/search? q = site% 3Awww.airs.com% 2Fblog% 2Farchives +% 22linkers + часть% 22 .

1
ответ дан 5 December 2019 в 08:25
поделиться

Документ, который может вам помочь, - это Как писать общие библиотеки Ульриха Дреппера. Ульритч, сопровождающий Linux glibc, является авторитетом в области ELF.

Несмотря на то, что эта статья о том, как писать разделяемые библиотеки и как экспортировать или не экспортировать символы, объясняется, как эти символы динамически разрешаются внутри exe-файла с форматом ELF.

Думаю, это ответит на ваш вопрос.

1
ответ дан 5 December 2019 в 08:25
поделиться