dimka76 63 2 февраля, 2010 Опубликовано 2 февраля, 2010 · Жалоба Сдаётся мне, что нет:) Моё предположение .... Наверное достоверно на этот вопрос только klen сможет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inco 1 2 февраля, 2010 Опубликовано 2 февраля, 2010 · Жалоба А у меня всё равно не работает ассемблер! Вот что выдаёт: Assembling: Startup/startup_stm32f10x_md.S arm-kgp-eabi-g++ -c -mthumb -mcpu=cortex-m3 -mthumb-interwork -I. -x assembler-with-cpp -D VECT_TAB_RAM -Wa,-adhlns=List/startup_stm32f10x_md.lst,--gdwarf-2 Startup/startup_stm32f10x_md.S -o obj/startup_stm32f10x_md.o make: *** [startup/startup_stm32f10x_md.o] Error 1 При этом версия kgp_arm_eabi_20091127 всё ест спокойно без возмущения Assembling: Startup/startup_stm32f10x_md.S arm-kgp-eabi-g++ -c -mthumb -mcpu=cortex-m3 -mthumb-interwork -I. -x assembler-with-cpp -D VECT_TAB_RAM -Wa,-adhlns=List/startup_stm32f10x_md.lst,--gdwarf-2 Startup/startup_stm32f10x_md.S -o obj/startup_stm32f10x_md.o Просто заменяю в директории WinARM файлы из одного или другого архива. С проектом и исходниками при этом ничего не делаю! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 2 февраля, 2010 Опубликовано 2 февраля, 2010 · Жалоба 2_AHTOXA Вы правы, под мелкоармами я понимаю то что называют "микроконтроллеры" - тоесть то где нет MMU, из того что я знаю это микрухи с флеш и озу в нутрях на arm7tdmi и cortex-m3. нада сказать что дело не вкомпиллере - он под любой cpu сможет генерить, дело в библиотеках и ld который нужный формат бинаря выдает. 2_inco Вы совершенно правы - еще косяг выщемил. забыл еще одну библу в дистрибутиив положить. в атаче зажатая архиватором 7z библы libgcc_s_dw2-1.dll и libgfortran-3.dll киньте в bin, все должно заработать. у меня arm-kgp-eabi-g++ -c -mthumb -mcpu=cortex-m3 -mthumb-interwork -I. -x assembler-with-cpp -D VECT_TAB_RAM -Wa,-adhlns=List/startup_stm32f10x_md.lst,--gdwarf-2 Startup/startup_stm32f10x_md.S -o obj/startup_stm32f10x_md.o нормально генерить асм. посмотрел filemon'ом - грузится libgcc_s_dw2-1.dll которую заюыл положить извиняюсь. издержки експеремента по переходу со статической на сборку с дллэлками - это должно снизить размер дистрибутива. не критично при современных скоростях интернета но давно хотел для красоты сделать. вот и вылазит что чтото забыл положить. во втором архиве еще libgfortran-3.dll, не проверял, пока допишите в bin если на фортране компиляееть собираетесь libgcc_s_dw2_1.7z bin.7z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 2 февраля, 2010 Опубликовано 2 февраля, 2010 (изменено) · Жалоба За свовременно выложенную dll спасибо. А что делать вот с этим: c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0/../../../../arm-kgp-eabi/bin/ld.exe: error: no memory region specified for loadable section `.ARM.exidx.text.__gnu_ldivmod_helper' В смысле, какой паттерн описать чтобы всё подобное попало куда надо? Мой скрипт выглядит так: SEARCH_DIR(.) /* * Define stack size here */ FIQ_STACK_SIZE = 0x0100; IRQ_STACK_SIZE = 0x0100; ABT_STACK_SIZE = 0x0100; UND_STACK_SIZE = 0x0100; SVC_STACK_SIZE = 0x0400; MEMORY { rom : org = 0x00100000, len = 64k ram : org = 0x00200000, len = 16k } /* * Do not change the next code */ SECTIONS { .text : { *(.vectors); . = ALIGN(4); *(.init); . = ALIGN(4); *(.text.*); . = ALIGN(4); *(.rodata); . = ALIGN(4); *(.rodata*); . = ALIGN(4); *(.glue_7t); . = ALIGN(4); *(.glue_7); /* . = ALIGN(4); KEEP (*(.eh_frame)) */ . = ALIGN(4); etext = .; } > rom .data : AT (ADDR (.text) + SIZEOF (.text)) { PROVIDE (__data_start = .); *(.ramfunc) . = ALIGN(4); *(.data) . = ALIGN(4); edata = .; _edata = .; PROVIDE (__data_end = .); } > ram .bss : { PROVIDE (__bss_start = .); *(.bss) *(COMMON) . = ALIGN(4); PROVIDE (__bss_end = .); . = ALIGN(256); PROVIDE (__stack_start = .); PROVIDE (__stack_fiq_start = .); . += FIQ_STACK_SIZE; . = ALIGN(4); PROVIDE (__stack_fiq_end = .); PROVIDE (__stack_irq_start = .); . += IRQ_STACK_SIZE; . = ALIGN(4); PROVIDE (__stack_irq_end = .); PROVIDE (__stack_abt_start = .); . += ABT_STACK_SIZE; . = ALIGN(4); PROVIDE (__stack_abt_end = .); PROVIDE (__stack_und_start = .); . += UND_STACK_SIZE; . = ALIGN(4); PROVIDE (__stack_und_end = .); PROVIDE (__stack_svc_start = .); . += SVC_STACK_SIZE; . = ALIGN(4); PROVIDE (__stack_svc_end = .); PROVIDE (__stack_end = .); PROVIDE (__heap_start = .); } > ram /DISCARD/ : { *(.eh_frame_hdr) *(.eh_frame) } } Изменено 2 февраля, 2010 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 2 февраля, 2010 Опубликовано 2 февраля, 2010 · Жалоба какой паттерн описать чтобы всё подобное попало куда надо? Вставьте __exidx_start = .; .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >rom куда-нибудь после glue_7t, но до etext. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 2 февраля, 2010 Опубликовано 2 февраля, 2010 (изменено) · Жалоба А эту куда? .ARM.extab.text.unwind_phase2_forced Описывал всё подряд... получил c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0/../../../../arm-kgp-eabi/bin/ld.exe: .text has both ordered [`.ARM.exidx.text.__gnu_ldivmod_helper' in c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0\libgcc.a(bpabi.o)] and unordered [`.ARM.extab.text.__gnu_ldivmod_helper' in c:/kgp_arm_eabi/bin/../lib/ gcc/arm-kgp-eabi/4.5.0\libgcc.a(bpabi.o)] sections c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0/../../../../arm-kgp-eabi/bin/ld.exe: final link failed: Bad value collect2: ld returned 1 exit status Есть у компилятора ключи чтобы не клал все функции в отдельные сеции? Или в каком порядке и где должны быть .ARM.extab.text.* и .ARM.exidx.text.* И ещё - надо ли ставить точку перед звёздочкой (в смысле - включать ли точку в шаблон) всяких имён секций .bss.*, .data.* и .text.* - что ещё можно встретить? ps: до этого исользовал сборку yagarto - решл попробовать... зы2: в конце теперь так c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0/../../../../arm-kgp-eabi/bin/ld.exe: .text has both ordered [`.ARM.exidx.text.__gnu_ldivmod_helper' in c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0\l ibgcc.a(bpabi.o)] and unordered [`.rodata._global_impure_ptr' in c:/kgp_arm_eabi/bin/../lib/gcc/arm-kg p-eabi/4.5.0/../../../../arm-kgp-eabi/lib\libc.a(lib_a-impure.o)] sections c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0/../../../../arm-kgp-eabi/bin/ld.exe: final link fail ed: Bad value АНТОХА, можете свой скрипт работающий с KGP выложить? Изменено 2 февраля, 2010 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 2 февраля, 2010 Опубликовано 2 февраля, 2010 · Жалоба А эту куда? .ARM.extab.text.unwind_phase2_forced А эту просто в текст: .text : { __ctors_start__ = .; KEEP(SORT(*)(.ctors)) __ctors_end__ = .; __dtors_start__ = .; __dtors_end__ = .; . = ALIGN(4); *(.text) /* remaining code */ *(.text.*) /* remaining code */ *(.rodata) /* read-only data (constants) */ *(.rodata*) *(.eh_frame_hdr) *(.eh_frame) *(.ARM.extab* .gnu.linkonce.armextab.*) *(.gcc_except_table) *(.eh_frame_hdr) *(.eh_frame) *(.glue_7) *(.glue_7t) . = ALIGN(4); } >rom __exidx_start = .; .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >rom __exidx_end = .; .text.align : { . = ALIGN(8); _etext = .; _sidata = _etext; } >rom .data : AT ( _sidata ) ... Есть у компилятора ключи чтобы не клал все функции в отдельные сеции? Для этих - вряд ли, это какие-то специальные секции. И ещё - надо ли ставить точку перед звёздочкой (в смысле - включать ли точку в шаблон) всяких имён секций .bss.*, .data.* и .text.* - что ещё можно встретить? Вот bss: .bss : { . = ALIGN(4); _sbss = .; /* Used by the startup in order to initialize the .bss section */ *(.bss) *(.bss.*) *(COMMON) . = ALIGN(4); _ebss = .; /* Used by the startup in order to initialize the .bss section */ _end = .; __end = .; } >RAM ps: до этого исользовал сборку yagarto - решл попробовать... Ягарто старое совсем. Лучше CodeSourcery Sourcery G++ Lite, а ещё лучше - сборки klen-а:) Рабочие варианты скриптов для этих двух сборок можно посмотреть здесь. Там для кортексов, но не суть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 2 февраля, 2010 Опубликовано 2 февраля, 2010 · Жалоба это у меня для кортекса работает /*ENTRY(Reset_Handler)*/ OUTPUT_FORMAT ("elf32-littlearm") MEMORY { flash (rx) : ORIGIN = 0x08000000, LENGTH = 256K ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K } /* define a global symbol _stack_end */ _stack_end_ = 0x2000ffff; /* now define the output sections */ SECTIONS { . = 0; /* set location counter to address zero */ .text : /* collect all sections that should go into FLASH after startup */ { . = ALIGN(4); KEEP(*(.flash_vec_table)) *(.text) *(.text*) /* all .text sections (code) */ *(.rodata) /* all .rodata sections (constants, strings, etc.) */ *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ *(.glue_7) /* all .glue_7 sections (no idea what these are) */ *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ *(.gnu*) *(.gcc*) . = ALIGN(4); _text_end_ = .; /* define a global symbol _etext just after the last code byte */ } >flash /* put all the above into FLASH */ _ram_vec_load_start_ = _text_end_; .ram_vec : { . = ALIGN(4); _ram_vec_start_ = .; KEEP(*(.ram_vec)) _ram_vec_end_ = ALIGN( . , 4); } >ram AT> flash _ram_vec_load_end_ = _ram_vec_load_start_ + SIZEOF(.ram_vec); _data_load_start_ = _ram_vec_load_end_; .data : /* collect all initialized .data sections that go into RAM */ { . = ALIGN(4); _data_start_ = .; /* create a global symbol marking the start of the .data section */ *(.data) /* all .data sections */ *(.data*) _data_end_ = ALIGN( . , 4); /* define a global symbol marking the end of the .data section */ } >ram AT >flash /* put all the above into RAM (but load the LMA copy into FLASH) */ _data_load_end_ = _data_load_start_ + SIZEOF(.data); _fast_load_start_ = _data_load_end_; .fast : { . = ALIGN(4); _fast_start_ = .; *(.fast) *(.fast*) _fast_end_ = ALIGN( . , 4); } >ram AT >flash _fast_load_end_ = _fast_load_start_ + SIZEOF(.fast); _flash_end_ = _fast_load_end_; .bss : { . = ALIGN(4); _bss_start_ = .; *(.bss) *(.bss*) _bss_end_ = .; } >ram DISCARD : { libc.a ( * ) libm.a ( * ) libgcc.a ( * ) } /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } } это у меня для arm7tdmi, подянял старый проект персобрал свежаком.. тут вообще примитивный скрипт. собирается. попробуйте ...мож получится, тока карту памяти измените под себя /* identify the Entry Point */ /*ENTRY(_vectors)*/ /* specify the LPC2148 memory areas */ MEMORY { flash : ORIGIN = 0, LENGTH = 512K /* FLASH ROM */ ram_vec : ORIGIN = 0x40000000, LENGTH = 64 /* vec table in RAM */ ram_isp_low(A) : ORIGIN = 0x40000120, LENGTH = 223 /* variables used by Philips ISP bootloader */ ram : ORIGIN = 0x40000200, LENGTH = 32513 /* free RAM area */ ram_isp_high(A) : ORIGIN = 0x40007FE0, LENGTH = 32 /* variables used by Philips ISP bootloader */ ram_usb_dma : ORIGIN = 0x7FD00000, LENGTH = 8192 /* on-chip USB DMA RAM area (not used) */ } /* define a global symbol _stack_end */ _stack_end = 0x40007EDC; /* now define the output sections */ SECTIONS { . = 0; /* set location counter to address zero */ _vec_load_start_ = .; .vec : { KEEP(*(.vec*)) } >flash /* the startup code goes into FLASH */ _vec_load_end_ = _vec_load_start_ + SIZEOF(.vec); .text : /* collect all sections that should go into FLASH after startup */ { *(.text*) /* all .text sections (code) */ *(.rodata*) /* all .rodata* sections (constants, strings, etc.) */ *(.glue_7) /* all .glue_7 sections (no idea what these are) */ *(.glue_7t) /* all .glue_7t sections (no idea what these are) */ _text_end = .; /* define a global symbol _etext just after the last code byte */ } >flash /* put all the above into FLASH */ .fast_vec : { _fast_vec_start_ = .; _fast_vec_end_ = _fast_vec_start_ + SIZEOF(.vec); } >ram_vec _fast_load_start_ = ALIGN ( _text_end , 4 ); .fast : { _fast_start_ = .; *(.fast) _fast_end_ = .; } >ram AT >flash _fast_load_end = _fast_load_start_ + SIZEOF(.fast); _data_load_start_ = ALIGN ( _fast_load_end , 4 ); .data : /* collect all initialized .data sections that go into RAM */ { _data_start_ = .; /* create a global symbol marking the start of the .data section */ *(.data) /* all .data sections */ _data_end_ = .; /* define a global symbol marking the end of the .data section */ } >ram AT >flash /* put all the above into RAM (but load the LMA copy into FLASH) */ _data_load_end_ = _data_load_start_ + SIZEOF(.data); .bss : /* collect all uninitialized .bss sections that go into RAM */ { _bss_start = .; /* define a global symbol marking the start of the .bss section */ *(.bss) /* all .bss sections */ } >ram /* put all the above in RAM (it will be cleared in the startup code */ . = ALIGN(4); /* advance location counter to the next 32-bit boundary */ _bss_end = .; /* define a global symbol marking the end of the .bss section */ } _end = .; /* define a global symbol marking the end of application RAM */ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 2 февраля, 2010 Опубликовано 2 февраля, 2010 · Жалоба Насчёт ягарто... обновлялся в декабре 2009-го года. C:\user\dds2\TC1\at91sam7s>arm-elf-gcc --version arm-elf-gcc.EXE (GCC) 4.4.2 Ваш скрипт попробую применить - на работающем проекте (arm7tdmi, AT91SAM7Sxxx). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inco 1 2 февраля, 2010 Опубликовано 2 февраля, 2010 · Жалоба Спасибо! Теперь действительно работает! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 2 февраля, 2010 Опубликовано 2 февраля, 2010 (изменено) · Жалоба Похоже, я нарвался на какой-то старый баг: http://www.mail-archive.com/[email protected]/msg01065.html Только сейчас, он конечно более детальную диагностику вызывает - но от этого не легче - имедж не собирается. Проект в аттачменте, в каталоге at91sam7s находится Makefile. В нём прописан путь к месту, где находится "свежак KGP". Кто-нибудь может понять, почему этот комплект не собирает? Изменено 2 февраля, 2010 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 3 февраля, 2010 Опубликовано 3 февраля, 2010 · Жалоба Кто-нибудь может понять, почему этот комплект не собирает? Потому что вы сделали не так, как я писал:) Вот, поправил: sam7x64_rom.zip (Обратите внимание, что откуда-то подтягивается вызов malloc.) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 3 февраля, 2010 Опубликовано 3 февраля, 2010 · Жалоба Потому что вы сделали не так, как я писал:) Вот, поправил: sam7x64_rom.zip (Обратите внимание, что откуда-то подтягивается вызов malloc.) всё начинается с откуда-то взявшегося unwind-arm.o. В варианте kgp. В моём я перевёл в discard eh_frame*, убралось десять килобайт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 3 февраля, 2010 Опубликовано 3 февраля, 2010 · Жалоба Так заработало? С этими секциями да, много непонятного. И самое непонятное - где взять инфу о том, что это за секции:) ЗЫ. Мои старые варианты линкерных скриптов для kgp перестали работать. Насколько я понял, конструкторы переехали из .ctors в .init_array. всё начинается с откуда-то взявшегося unwind-arm.o. В варианте kgp. В моём я перевёл в discard eh_frame*, убралось десять килобайт. Есть более правильный вариант: sys.zip Добавьте этот файл к проекту, и ничего не придётся дискардить:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 3 февраля, 2010 Опубликовано 3 февраля, 2010 · Жалоба Так заработало? Собранное kgp при объёме 46 килобайт работает. С этимже скриптом yagarto даёт имедж размером 36 килобайт. Вернуть на место discard - опят 30.5 килобайт. sys.zip - это заплата, спсибо, но я не стал бы её использовать. Я не хотел бы терять контроля над кодом, дабы избежать непредсказуемого поведения в embedded приложении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться