LINUX.ORG.RU

Портирование асма на оффтопик

 ,


0

2

Неожиданно столкнулся с тем, что ассемблер под mingw чутка отличается от gcc’шного (хотя при этом у нас уже много чисто асмовых модулей, например sha2, на которых граблей не было, нужно было только экспортные имена поменять).

У нас есть код:

.section .rodata
      .global <symbolname>
      .type   <symbolname>, @object
      .align  4
<symbolname>:
      .incbin "./files/<symbolname>.ext"
      .byte 0
<symbolname>_end:
      .global <symbolname>_size
      .type   <symbolname>_size, @object
      .align  4
<symbolname>_size:
      .int    <symbolname>_end -<symbolname>

После чего мы генерим такой файл:

#ifndef <SYMBOLNAME>
#define <SYMBOLNAME>

extern const char <symbolname>[];
extern const u32 <symbolname>_size;

#endif /* <SYMBOLNAME> */

Как выяснилось, gcc это кушает хорошо, в вот mingw жрать не хочет:

<symbolname>_gen.s: Сообщения ассемблера:
<symbolname>_gen.s:3: Предупреждение: Псевдооперация .type используется вне .def/.endef: игнорируется.
<symbolname>_gen.s:3: Ошибка: мусор в конце строки, первый нераспознанный символ «m»
<symbolname>_gen.s:10: Предупреждение: Псевдооперация .type используется вне .def/.endef: игнорируется.
<symbolname>_gen.s:10: Ошибка: мусор в конце строки, первый нераспознанный символ «m»

Помогите, пожалуйста портировать эту засаду под mingw/win32.

Суть в автоматическом встраивании внешних файлов в бинарь. Например у нас есть JSON-файл со схемой валидации. Вместо того чтобы таскать его с собой, открывать на чтение и проч. просто используем условный myjson[].

★★★★★

Последнее исправление: PPP328 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Это я криво замазал настоящие имена, там <symbolname>

.type с таким синтаксисом годится только для эльфов. уберите его. нафиг он вообще вам нужен?

А что тогда для юродивого PE? Вообще ничего не ставить?

PPP328 ★★★★★
() автор топика
Последнее исправление: PPP328 (всего исправлений: 1)

Суть в автоматическом встраивании внешних файлов в бинарь

ld-скрипты?

d ★★★★★
()
Ответ на: комментарий от d

Способ выше проще потому что сразу дает и файл и символы. В первый раз напоролись на то, что оно под mingw перестало работать.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

Без отладочных символов всё работает в relocatable ELF

.section .rodata
      .global symbolname
//      .type   <symbolname>, @object
      .align  4
symbolname:
      .incbin "./files/symbolname.ext"
      .byte 0
symbolname_end:
      .global symbolname_size
//      .type   <symbolname>_size, @object
      .align  4
symbolname_size:
      .int    symbolname_end -symbolname

as g.s -o g.o; nm g.o

0000000000000000 R symbolname
0000000000000201 r symbolname_end
0000000000000204 R symbolname_size
vM ★★
()
Ответ на: комментарий от PPP328

Отладочные символы нужны прежде всего отладчику, чтобы показывать, внутри какой функции остановился поток. А Windows’у и linux’у, выполняющему программу, они не нужны.

vM ★★
()
Последнее исправление: vM (всего исправлений: 1)
Ответ на: комментарий от vM

Под linux может и да, под mingw без .type говорит что не может найти такие объекты при линковке:

<file1>.c:(.data+0x20): undefined reference to `<symbolname1>'
<file1>.c:(.data+0x34): undefined reference to `<symbolname2>'
<file1>.c:(.data+0x48): undefined reference to `<symbolname3>'
<file1>.c:(.data+0x5c): undefined reference to `<symbolname4>'
<file1>.c:(.data+0x70): undefined reference to `<symbolname5>'
PPP328 ★★★★★
() автор топика
Ответ на: комментарий от vM

objdump -t говорит что имя в .о соответствует тому что в .h и соответственно тому, которое используется непосредственно в коде

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

А, всё, my bad, забыли старые .S файлы почистить. Всё решено.

Наш шаблон экспорта (вдруг кому пригодится):

/*! \brief Генерирует текстовое представление ASM-файла
 * \param[in] filename Имя исходного файла
 * \param[in] varname Имя переменной
 * \return Статическая строка */
static const char * _assembler_generate(const char * filename,
                                        const char * varname) {
    static char s_text[VLH_ASM_FILESIZE];
    sprintf(
        s_text,
        "#if defined(__MINGW32__) || defined(__MINGW64__)\n"
        "#    define VAL_TYPE(S)\n"
        "#    define VAL_NAME(S) _ ## S\n"
        "#else\n"
        "#    define VAL_TYPE(S) .type S, @object\n"
        "#    define VAL_NAME(S) S\n"
        "#endif\n"
        "\n"
        "/* Для ARM нужно заменить @ на # */\n"
        "\n"
        ".section .rodata\n"
        "      .global VAL_NAME(%s)\n"
        "      VAL_TYPE(%s)\n"
        "      .align  4\n"
        "VAL_NAME(%s):\n"
        "     .incbin \"%s\"\n"
        "    .byte 0\n"
        "VAL_NAME(%s_end):\n"
        "     .global VAL_NAME(%s_size)\n"
        "     VAL_TYPE(%s_size)\n"
        "     .align  4\n"
        "VAL_NAME(%s_size):\n"
        "     .int    VAL_NAME(%s_end) - VAL_NAME(%s)\n",
        varname,
        varname,
        varname,
        filename,
        varname,
        varname,
        varname,
        varname,
        varname,
        varname
    );
    return s_text;
}
PPP328 ★★★★★
() автор топика
Последнее исправление: PPP328 (всего исправлений: 1)
Ответ на: комментарий от PPP328
i686-w64-mingw32-gcc -c c.c -o c.mingw
i686-w64-mingw32-as g.s -o g.mingw
i686-w64-mingw32-nm c.mingw g.mingw
c.mingw:
00000000 b .bss
00000000 d .data
00000000 r .rdata$zzz
00000000 t .text
         U _symbolname
         U _symbolname_size
00000004 D _use_size
00000000 D _usesymbol

g.mingw:
00000000 b .bss
00000000 d .data
00000000 r .rodata
00000000 t .text
00000000 R symbolname
00000201 r symbolname_end
00000204 R symbolname_size

В итоге

i686-w64-mingw32-ld c.mingw g.mingw -o e.mingw
i686-w64-mingw32-ld: c.mingw:c.c:(.data+0x0): undefined reference to `symbolname'
i686-w64-mingw32-ld: c.mingw:c.c:(.data+0x4): undefined reference to `symbolname_size'
vM ★★
()
Ответ на: комментарий от vM

Ага, мы упустили момент что декорирование для виндов надо добавлять. Спасибо. Выше скинул шаблон что мы теперь используем.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

Можно и отключить подчёркивание у gcc, но тогда с другими библиотеками могут быть неудобства.

i686-w64-mingw32-gcc --no-leading-underscore -c c.c -o c.mingw
nm c.mingw
#i686-w64-mingw32-ld c.mingw g.mingw -o e.mingw
00000000 b .bss
00000000 d .data
00000000 r .rdata$zzz
00000000 t .text
         U symbolname
         U symbolname_size
00000004 D use_size
00000000 D usesymbol
vM ★★
()

Суть в автоматическом встраивании внешних файлов в бинарь.

проприетасты должны страдать. вообще уже крышей поехали.

удивительно как тебе кто-то тут еще пытается помочь. да еще под мингв. язабан.

anonymous
()
Ответ на: комментарий от anonymous

Дядя, не все кто встраивают файлы проприетасты. Суть в легком деплое и запуске без внешних зависимостей конфигов и файлов

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

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

Дядя, не все кто встраивают файлы проприетасты.

То есть конкретно ты - не проприетаст? И даже если не все, то все равно это - проприетарная наклонность, которая не позволяет пользователю просто посмотреть и если надо отредактировать программные файлы.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.