Каково условие для символа равенства для линкера в Windows?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Каково условие для символа равенства для линкера в Windows?

Сообщение Anonymous »

Я пишу линкеров для Windows. Я собрал простую программу «Hello World» с использованием Cl.exe , и теперь я пытаюсь связать ее с помощью моего пользовательского линкера, но она не работает. Он работает нормально, используя Link.exe .

Код: Выделить всё

// hello.c
#include 

int main(void) {
printf("Hello, Windows!\n");
return 0;
}
Сгенерированный файл объекта содержит неопределенный символ под названием?

Код: Выделить всё

# dumpbin output
00F 00000000 SECT4  notype ()    External     | ___local_stdio_printf_options
010 00000000 UNDEF  notype ()    External     | ___acrt_iob_func
011 00000000 UNDEF  notype ()    External     | ___stdio_common_vfprintf
012 00000000 SECT5  notype ()    External     | __vfprintf_l
013 00000000 SECT6  notype ()    External     | _printf
014 00000000 SECT3  notype ()    External     | _main
015 00000008 UNDEF  notype       External     | ?_OptionsStorage@?1??__local_stdio_printf_options@@9@9 (`__local_stdio_printf_options'::`2'::_OptionsStorage)
016 00000000 SECT7  notype       Static       | .data
Section length   11, #relocs    0, #linenums    0, checksum F2A3A4F3
018 00000000 SECT7  notype       Static       | $SG9585
019 00000000 SECT8  notype       Static       | .chks64
Section length   40, #relocs    0, #linenums    0, checksum        0
< /code>
Мой линкер не может разрешить этот символ, потому что он сравнивает символы, используя простое сравнение строк. libcmt.lib 
содержит ли аналогичный символ под названием?

Код: Выделить всё

# dumpbin output
07A 00000000 SECT27 notype       Static       | .xdata$x
Section length   1C, #relocs    2, #linenums    0, checksum 6A27921E, selection    5 (pick associative Section 0x1C)
07C 00000000 SECT27 notype       Static       | __sehtable$?notify_debugger@@YAXABUtagEXCEPTION_VISUALCPP_DEBUG_INFO@@@Z
07D 00000000 SECT28 notype       Static       | .bss
Section length    8, #relocs    0, #linenums    0, checksum        0, selection    2 (pick any)
07F 00000000 SECT28 notype       External     | ?_OptionsStorage@?1??__local_stdio_printf_options@@9@4_KA (unsigned __int64 `__local_stdio_printf_options'::`2'::_OptionsStorage)
080 00000000 SECT29 notype       Static       | .rdata
Section length   6C, #relocs    0, #linenums    0, checksum DD6D9A7E, selection    2 (pick any)
082 00000000 SECT29 notype       External     | ??_C@_1GM@CNOOJIHC@?$AAR?$AAu?$AAn?$AAt?$AAi?$AAm?$AAe?$AA?5?$AAC?$AAh?$AAe?$AAc?$AAk?$AA?5?$AAE@ (`string')
083 00000000 SECT2A notype       Static       | .rdata
< /code>
Эти символы выглядят очень похожими. Когда я использую undname.exe 
, чтобы отступить их, похоже, что первое в конечном итоге становится суффиксом последнего:

Код: Выделить всё

Undecoration of :- "?_OptionsStorage@?1??__local_stdio_printf_options@@9@9"
is :- "`__local_stdio_printf_options'::`2'::_OptionsStorage"

Undecoration of :- "?_OptionsStorage@?1??__local_stdio_printf_options@@9@4_KA"
is :- "unsigned __int64 `__local_stdio_printf_options'::`2'::_OptionsStorage"
< /code>
Но этого недостаточно, чтобы ответить на мои вопросы, которые: < /p>
[list]
[*] Как мне выяснить, есть ли? _Optionsstorage@? 1 ?? __ local_stdio_printf_options @@ 9@4_ka 
является ли символ, который link.exe используется для успешного разрешения не определенного символа в hello.obj ? Запуск link.exe с/verbose и/или/map , кажется, не дает мне эту информацию.
[*] Если это Является ли определение, которое выбрано для разрешения символов, почему? Имена символов не совсем одинаковы. < /Li>
Есть ли другой чек, помимо простого равенства, которое я должен делать в своем линкере, чтобы сделать эту работу должным образом? Как мне это сделать надежно?
[/list]

Подробнее здесь: https://stackoverflow.com/questions/794 ... on-windows
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»