Trouble building for the GCArmv7A target [message #1447658] |
Sat, 18 October 2014 17:46 |
Chris H Messages: 11 Registered: September 2014 |
Junior Member |
|
|
I am trying to build my first RTSC application (as a package) which uses a package I also created. The "collections" package I created implements only one module called "Queue". I have no problems building the package itself for the following targets:
======== config.bld ========
var Build = xdc.useModule('xdc.bld.BuildEnvironment');
var MINGW = xdc.useModule('gnu.targets.Mingw');
var MINGW_ROOT = java.lang.System.getenv("MINGW_ROOT");
MINGW.rootDir = MINGW_ROOT;
MINGW.ccOpts.prefix = "-m32 -O2";
var ARMLinux = xdc.useModule('gnu.targets.arm.GCArmv7A');
var LINARO_LINUX_ROOT = java.lang.System.getenv("LINARO_LINUX_ROOT");
ARMLinux.rootDir = LINARO_LINUX_ROOT
ARMLinux.LONGNAME = "bin/arm-linux-gnueabi-gcc.exe";
var C64P = xdc.useModule('ti.targets.C64P');
C64P.rootDir = "C:/ti/ccsv6/tools/compiler/c6000_7.4.8";
//Build.targets = [C64P, MINGW, ARMLinux];
My test application, however, fails with an internal compiler error for the GCArmv7A target:
C:\MyRepos\examples\test>xdc all
making package.mak (because of package.bld) ...
generating interfaces for package test (because package/package.xdc.inc is older than package.xdc) ...
configuring prog.xv7A from package/cfg/prog_pv7A.cfg ...
clv7A package/cfg/prog_pv7A.c ...
package/cfg/prog_pv7A.c:4983:1: internal compiler error: in get_variable_section, at varasm.c:1012
Please submit a full bug report,
with preprocessed source if appropriate.
See <link removed> for instructions.
gmake.exe: *** [package/cfg/prog_pv7A.ov7A] Error 1
I have searched for this error and have not found any helpful leads. I use the Linaro 2012.04 toolchain for Windows quite extensively outside RTSC and have not had this issue. Here is the code for the "collections" package:
======== Package.bld ========
var Build = xdc.useModule('xdc.bld.BuildEnvironment');
var Pkg = xdc.useModule('xdc.bld.PackageContents');
for each (var targ in Build.targets)
{
Pkg.addLibrary("lib/" + Pkg.name, targ).addObjects(["Queue.c"]);
}
======== Package.xdc ========
package collections [1,0,0]
{
module Queue;
}
======== Queue.xdc ========
module Queue
{
instance:
create();
config UInt16 size = 32;
Int8 Enqueue(UInt8 item);
Int8 Dequeue(UInt8 * item);
Int8 Peek(UInt8 * item);
UInt16 Count();
UInt16 Capacity();
Void Clear();
internal:
struct Instance_State
{
UInt8 buffer[]; /*! Buffer used to hold queued items */
UInt16 capacity; /*! Maximum number of items the queue can hold */
UInt16 count; /*! Number of items in the queue */
UInt16 head; /*! Index of head item in queue */
UInt16 tail; /*! Index of tail item in queue */
};
}
======== Queue.c ========
#include "xdc/std.h"
#include "package/internal/Queue.xdc.h"
Int8 Queue_Enqueue(Queue_Object * obj, UInt8 item)
{
if (obj->count == obj->capacity)
{
// Overflow occurred
return (-1);
}
obj->buffer[obj->head] = item;
obj->head++;
if (obj->head == obj->capacity)
{
obj->head = 0;
}
obj->count++;
return (0);
}
Int8 Queue_Dequeue(Queue_Object * obj, UInt8 * item)
{
if (obj->count == 0)
{
// Queue is empty
return (-1);
}
*item = obj->buffer[obj->tail];
(obj->tail)++;
if (obj->tail == obj->capacity)
{
obj->tail = 0;
}
obj->count--;
return(0);
}
Int8 Queue_Peek(Queue_Object * obj, UInt8 * item)
{
if (obj->count == 0)
{
// Queue is empty
return (-1);
}
*item = obj->buffer[obj->tail];
return(0);
}
UInt16 Queue_Count(Queue_Object * obj)
{
return obj->count;
}
UInt16 Queue_Capacity(Queue_Object * obj)
{
return obj->capacity;
}
Void Queue_Clear(Queue_Object * obj)
{
obj->count = 0;
obj->head = 0;
obj->tail = 0;
}
Void Queue_Instance_init(Queue_Object * obj, const Queue_Params * params)
{
obj->capacity = params->size;
obj->count = 0;
obj->head = 0;
obj->tail = 0;
}
======== Queue.xs ========
function instance$static$init(obj, params)
{
obj.buffer.length = params.size;
obj.capacity = params.size;
obj.count = 0;
obj.head = 0;
obj.tail = 0;
}
Here is the code for my test application:
======== test/package.bld ========
var Build = xdc.useModule('xdc.bld.BuildEnvironment');
var Pkg = xdc.useModule('xdc.bld.PackageContents');
for each (var targ in Build.targets) {
Pkg.addExecutable("prog", targ, targ.platform).addObjects(["prog.c"]);
}
======== test/package.xdc ========
requires collections;
package test {};
======== test/prog.cfg ========
var System = xdc.useModule('xdc.runtime.System');
var Program = xdc.useModule('xdc.cfg.Program');
var Q = xdc.useModule('collections.Queue');
Program.global["qInstStatic"] = Q.create({size:4});
======== test/prog.c ========
#include <xdc/runtime/System.h>
#include <xdc/cfg/global.h>
#include <Collections/Queue.h>
int main()
{
UInt8 i;
UInt8 sz = Queue_Capacity(qInstStatic);
for (i = 0; i < sz; i++)
{
Queue_Enqueue(qInstStatic, i);
}
UInt8 item;
for (i = 0; i < sz; i++)
{
Queue_Dequeue(qInstStatic, &item);
System_printf("Item is %i\n", item);
}
return 0;
}
The MinGW and C64P targets build and run just fine, so hopefully I just missed something in the configuration. I have built against XDCTools 3.25.06.96 and 3.25.06.96 with the same results. Sorry for the code intense post.
Chris
|
|
|
Re: Trouble building for the GCArmv7A target [message #1449087 is a reply to message #1447658] |
Mon, 20 October 2014 22:38 |
Alexei Colin Messages: 8 Registered: October 2013 |
Junior Member |
|
|
IANE, but is the toolchain for Linux ABI appropriate for your case? Would arm-none-eabi-gcc be more appropriate than arm-linux-gnueabi-gcc? Not sure whether it is directly relevant, but XDC build for the v7A target provides its own C-runtime.
I successfully built your example (archive attached) for GCArmv7A with XDCTools v3.25.05.94 on Linux i686 host with arm-none-eabi-gcc 4.7.4 20130913 (from gcc-arm-none-eabi deb package), but not out-of-the box -- had to deal with the following issues. The following is almost certainly irrelevant to your case, but for benefit of Googlers that land on this thread.
1. *Problem*: warning about enums
/usr/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/bin/ld: warning: /home/acolin/rtml/src/ti/xdctools/xdctools_3_25_05_94/packages/gnu/targets/arm/rtsv7A/lib/gnu.targets.arm.rtsv7A.av7A(Assert.ov7A) uses 32-bit enums yet the output is to use variable-size enums; use of enum values across objects may fail
*Fix*: This is due to an incompatibilty between the build environment which built the xdctool package binaries in the distribution and the compiler used to build the app and link the two. Fixed by rebuilding gnu/targets/arm/rtsv7A package with app's toolchain [*]. Ranted about this in a thread in TI-RTOS forum ("undefined reference to `atexit' in xdctools").
2. *Problem*: libc can't find _exit syscall
/usr/arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x2c): undefined reference to `_exit'
*Fix*: _exit syscall is defined in gnu/targets/arm/rtsv7A/syscalls.c but the corresponding object appears (within the linker script included via -T) before libc (-lc) on the linker cmd line, so linker doesn't look in syscalls.o. One fix is to add 'GCCTarget.lnkOpts.prefix = "-lc"' to config.bld. But it's probably not the right fix in light of this discussion.
3. *Problem*: libc can't find _sbrk syscall
/usr/arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'
*Fix*: this one is not defined in syscalls.c, so a pseudo-fix is to either define a sttub there and rebuild gnu/targets/arm/rtsv7A [*] or define a stub in the test app (e.g. prog.c): void _sbrk(int *inc) { (void)inc; }
4. *Problem*: .gnu.attributes section referenced in XDC's linker script doesn't exist
/usr/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/bin/ld: .gnu.attributes not found for insert
*Fix*: objdump on object files only shows .ARM.attributes but not .gnu.attributes (arm-none-eabi-gcc -v says 2.22). A workaround: edit gnu/targets/arm/linkcmd.xdt, change 'INSERT BEFORE .gnu.attributes' to .ARM.attributes: almost certainly the wrong thing to do, but removing the INSERT command won't work since that has a documented side-effect of disabling the default linker script.
[*] Issue when rebuilding gnu/targets/arm/rtsv7A:
*Problem*: Assembler doesn't like floating-point-unit-related instruction in boot.asm
boot.asm:115: Error: selected processor does not support ARM mode `fmxr fpexc,r0'
*Fix:* Edit gnu/targets/arm/GCArmv7A.xdc, add "-mfpu=vfp" to asm.opts. It's not clear why this field is marked readonly, which prevents from a cleaner fix of specifying this in config.bld like compiler options and linker options. Rebuild gnu/targets/arm with 'xdc all' and then rebuild gnu/targets/arm/rtsv7A with 'xdc clean && xdc all'.
[Updated on: Mon, 20 October 2014 22:51] Report message to a moderator
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.04175 seconds