[PATCH 2/4] covoar: Use DWARF to map addresses to source files and lines.
Joel Sherrill
joel at rtems.org
Sat May 5 16:44:35 UTC 2018
Looks similar to Cillian's failure. Chris will have to show me where
libdwarf comes from. It needs to be supplied with RTEMS tools for
consistency.
On Sat, May 5, 2018, 11:20 AM Vijay Kumar Banerjee <vijaykumar9597 at gmail.com>
wrote:
> In file included from ../rtemstoolkit/rld-dwarf.h:29:0,
> from ../tester/covoar/ExecutableInfo.h:14,
> from ../tester/covoar/DesiredSymbols.h:17,
> from ../tester/covoar/app_common.h:11,
> from ../tester/covoar/app_common.cc:40:
> ../rtemstoolkit/rld-dwarf-types.h:28:10: fatal error: dwarf.h: No such
> file or directory
> #include <dwarf.h>
> ^~~~~~~~~
> compilation terminated.
>
> In file included from ../rtemstoolkit/rld-dwarf.h:29:0,
> from ../tester/covoar/ExecutableInfo.h:14,
> from ../tester/covoar/CoverageReaderBase.h:10,
> from ../tester/covoar/CoverageFactory.h:12,
> from ../tester/covoar/CoverageFactory.cc:13:
> ../rtemstoolkit/rld-dwarf-types.h:28:10: fatal error: dwarf.h: No such
> file or directory
> #include <dwarf.h>
> ^~~~~~~~~
> compilation terminated.
>
> In file included from ../rtemstoolkit/rld-dwarf.h:29:0,
> from ../tester/covoar/ExecutableInfo.h:14,
> from ../tester/covoar/CoverageReaderBase.h:10,
> from ../tester/covoar/CoverageReaderBase.cc:8:
> ../rtemstoolkit/rld-dwarf-types.h:28:10: fatal error: dwarf.h: No such
> file or directory
> #include <dwarf.h>
> ^~~~~~~~~
> compilation terminated.
>
> In file included from ../rtemstoolkit/rld-dwarf.h:29:0,
> from ../tester/covoar/ExecutableInfo.h:14,
> from ../tester/covoar/DesiredSymbols.h:17,
> from ../tester/covoar/app_common.h:11,
> from ../tester/covoar/CoverageReaderQEMU.cc:14:
> ../rtemstoolkit/rld-dwarf-types.h:28:10: fatal error: dwarf.h: No such
> file or directory
> #include <dwarf.h>
> ^~~~~~~~~
> compilation terminated.
>
> Waf: Leaving directory
> `/home/lunatic/development/rtems/test/rtems-tools/build'
> Build failed
> -> task in 'ccovoar' failed with exit status 1:
> {task 140568634826336: cxx app_common.cc -> app_common.cc.1.o}
> ['/usr/bin/g++', '-std=c++11', '-O2', '-g', '-Itester/covoar',
> '-I../tester/covoar', '-Irtemstoolkit', '-I../rtemstoolkit',
> '-Irtemstoolkit/elftoolchain/libelf',
> '-I../rtemstoolkit/elftoolchain/libelf',
> '-Irtemstoolkit/elftoolchain/common',
> '-I../rtemstoolkit/elftoolchain/common', '-Irtemstoolkit/libiberty',
> '-I../rtemstoolkit/libiberty', '../tester/covoar/app_common.cc', '-c',
> '-o/home/lunatic/development/rtems/test/rtems-tools/build/tester/covoar/app_common.cc.1.o']
> -> task in 'ccovoar' failed with exit status 1:
> {task 140568634826416: cxx CoverageFactory.cc -> CoverageFactory.cc.1.o}
> ['/usr/bin/g++', '-std=c++11', '-O2', '-g', '-Itester/covoar',
> '-I../tester/covoar', '-Irtemstoolkit', '-I../rtemstoolkit',
> '-Irtemstoolkit/elftoolchain/libelf',
> '-I../rtemstoolkit/elftoolchain/libelf',
> '-Irtemstoolkit/elftoolchain/common',
> '-I../rtemstoolkit/elftoolchain/common', '-Irtemstoolkit/libiberty',
> '-I../rtemstoolkit/libiberty', '../tester/covoar/CoverageFactory.cc', '-c',
> '-o/home/lunatic/development/rtems/test/rtems-tools/build/tester/covoar/CoverageFactory.cc.1.o']
> -> task in 'ccovoar' failed with exit status 1:
> {task 140568634392656: cxx CoverageReaderBase.cc ->
> CoverageReaderBase.cc.1.o}
> ['/usr/bin/g++', '-std=c++11', '-O2', '-g', '-Itester/covoar',
> '-I../tester/covoar', '-Irtemstoolkit', '-I../rtemstoolkit',
> '-Irtemstoolkit/elftoolchain/libelf',
> '-I../rtemstoolkit/elftoolchain/libelf',
> '-Irtemstoolkit/elftoolchain/common',
> '-I../rtemstoolkit/elftoolchain/common', '-Irtemstoolkit/libiberty',
> '-I../rtemstoolkit/libiberty', '../tester/covoar/CoverageReaderBase.cc',
> '-c',
> '-o/home/lunatic/development/rtems/test/rtems-tools/build/tester/covoar/CoverageReaderBase.cc.1.o']
> -> task in 'ccovoar' failed with exit status 1:
> {task 140568634392736: cxx CoverageReaderQEMU.cc ->
> CoverageReaderQEMU.cc.1.o}
> ['/usr/bin/g++', '-std=c++11', '-O2', '-g', '-Itester/covoar',
> '-I../tester/covoar', '-Irtemstoolkit', '-I../rtemstoolkit',
> '-Irtemstoolkit/elftoolchain/libelf',
> '-I../rtemstoolkit/elftoolchain/libelf',
> '-Irtemstoolkit/elftoolchain/common',
> '-I../rtemstoolkit/elftoolchain/common', '-Irtemstoolkit/libiberty',
> '-I../rtemstoolkit/libiberty', '../tester/covoar/CoverageReaderQEMU.cc',
> '-c',
> '-o/home/lunatic/development/rtems/test/rtems-tools/build/tester/covoar/CoverageReaderQEMU.cc.1.o']
>
> On 5 May 2018 at 21:47, Joel Sherrill <joel at rtems.org> wrote:
>
>>
>>
>> On Sat, May 5, 2018, 10:57 AM Vijay Kumar Banerjee <
>> vijaykumar9597 at gmail.com> wrote:
>>
>>> Hello,
>>>
>>> I'm getting this build failure after applying this patch
>>>
>>> ---
>>> Build failed
>>> -> task in 'ccovoar' failed with exit status 1:
>>> {task 140086064254560: cxx app_common.cc -> app_common.cc.1.o}
>>> ['/usr/bin/g++', '-std=c++11', '-O2', '-g', '-Itester/covoar',
>>> '-I../tester/covoar', '-Irtemstoolkit', '-I../rtemstoolkit',
>>> '-Irtemstoolkit/elftoolchain/libelf',
>>> '-I../rtemstoolkit/elftoolchain/libelf',
>>> '-Irtemstoolkit/elftoolchain/common',
>>> '-I../rtemstoolkit/elftoolchain/common', '-Irtemstoolkit/libiberty',
>>> '-I../rtemstoolkit/libiberty', '../tester/covoar/app_common.cc', '-c',
>>> '-o/home/lunatic/development/rtems/test/rtems-tools/build/tester/covoar/app_common.cc.1.o']
>>>
>>
>> I don't see an error. Just the command. Does waf -v show more? Were there
>> error messages after the command?
>>
>
>>>
>>> -- vijay
>>>
>>> On 5 May 2018 at 14:10, Chris Johns <chrisj at rtems.org> wrote:
>>>
>>>> ---
>>>> tester/covoar/DesiredSymbols.cc | 122
>>>> ++--------------------------------------
>>>> tester/covoar/ExecutableInfo.cc | 80 +++++++++++++++++---------
>>>> tester/covoar/ExecutableInfo.h | 41 +++++++++++---
>>>> tester/covoar/covoar.cc | 2 +-
>>>> tester/covoar/wscript | 2 +-
>>>> 5 files changed, 94 insertions(+), 153 deletions(-)
>>>>
>>>> diff --git a/tester/covoar/DesiredSymbols.cc
>>>> b/tester/covoar/DesiredSymbols.cc
>>>> index 9957b28..79ee78d 100644
>>>> --- a/tester/covoar/DesiredSymbols.cc
>>>> +++ b/tester/covoar/DesiredSymbols.cc
>>>> @@ -449,123 +449,13 @@ namespace Coverage {
>>>>
>>>> )
>>>> {
>>>> - char* base;
>>>> - char* cStatus;
>>>> - char command[512];
>>>> - std::string fileName;
>>>> - CoverageRanges::ranges_t::iterator ritr;
>>>> - char rpath[PATH_MAX];
>>>> - FILE* tmpfile;
>>>> -
>>>> - // Open a temporary file for the uncovered ranges.
>>>> - tmpfile = fopen( "ranges1.tmp", "w" );
>>>> - if ( !tmpfile ) {
>>>> - fprintf(
>>>> - stderr,
>>>> - "ERROR: DesiredSymbols::determineSourceLines - "
>>>> - "unable to open %s\n",
>>>> - "ranges1.tmp"
>>>> - );
>>>> - exit(-1);
>>>> - }
>>>> -
>>>> - // Write the range addresses to the temporary file.
>>>> - for (ritr = theRanges->set.begin();
>>>> - ritr != theRanges->set.end();
>>>> - ritr++ ) {
>>>> - fprintf(
>>>> - tmpfile,
>>>> - "0x%08x\n0x%08x\n",
>>>> - ritr->lowAddress - theExecutable->getLoadAddress(),
>>>> - ritr->highAddress - theExecutable->getLoadAddress()
>>>> - );
>>>> - }
>>>> -
>>>> - fclose( tmpfile );
>>>> -
>>>> - // Invoke addr2line to generate the source lines for each address.
>>>> - if (theExecutable->hasDynamicLibrary())
>>>> - fileName = theExecutable->getLibraryName();
>>>> - else
>>>> - fileName = theExecutable->getFileName();
>>>> -
>>>> - sprintf(
>>>> - command,
>>>> - "%s -Ce %s <%s | dos2unix >%s",
>>>> - TargetInfo->getAddr2line(),
>>>> - fileName.c_str(),
>>>> - "ranges1.tmp",
>>>> - "ranges2.tmp"
>>>> - );
>>>> -
>>>> - if (system( command )) {
>>>> - fprintf(
>>>> - stderr,
>>>> - "ERROR: DesiredSymbols::determineSourceLines - "
>>>> - "command (%s) failed\n",
>>>> - command
>>>> - );
>>>> - exit( -1 );
>>>> - }
>>>> -
>>>> - // Open the addr2line output file.
>>>> - tmpfile = fopen( "ranges2.tmp", "r" );
>>>> - if ( !tmpfile ) {
>>>> - fprintf(
>>>> - stderr,
>>>> - "ERROR: DesiredSymbols::determineSourceLines - "
>>>> - "unable to open %s\n",
>>>> - "ranges2.tmp"
>>>> - );
>>>> - exit(-1);
>>>> + for (auto& r : theRanges->set) {
>>>> + std::string location;
>>>> + theExecutable->getSourceAndLine(r.lowAddress, location);
>>>> + r.lowSourceLine = rld::path::basename (location);
>>>> + theExecutable->getSourceAndLine(r.highAddress, location);
>>>> + r.highSourceLine = rld::path::basename (location);
>>>> }
>>>> -
>>>> - // Process the addr2line output.
>>>> - for (ritr = theRanges->set.begin();
>>>> - ritr != theRanges->set.end();
>>>> - ritr++ ) {
>>>> -
>>>> - cStatus = fgets( inputBuffer, MAX_LINE_LENGTH, tmpfile );
>>>> - if ( cStatus == NULL ) {
>>>> - fprintf(
>>>> - stderr,
>>>> - "ERROR: DesiredSymbols::determineSourceLines - "
>>>> - "Out of sync in addr2line output\n"
>>>> - );
>>>> - exit( -1 );
>>>> - }
>>>> - inputBuffer[ strlen(inputBuffer) - 1] = '\0';
>>>> -
>>>> - // Use only the base filename without directory path.
>>>> -#ifdef _WIN32
>>>> - #define realpath(N,R) _fullpath((R),(N),_MAX_PATH)
>>>> -#endif
>>>> - realpath( inputBuffer, rpath );
>>>> - base = basename( rpath );
>>>> -
>>>> - ritr->lowSourceLine = std::string( base );
>>>> -
>>>> - cStatus = fgets( inputBuffer, MAX_LINE_LENGTH, tmpfile );
>>>> - if ( cStatus == NULL ) {
>>>> - fprintf(
>>>> - stderr,
>>>> - "ERROR: DesiredSymbols::determineSourceLines - "
>>>> - "Out of sync in addr2line output\n"
>>>> - );
>>>> - exit( -1 );
>>>> - }
>>>> - inputBuffer[ strlen(inputBuffer) - 1] = '\0';
>>>> -
>>>> - // Use only the base filename without directory path.
>>>> - realpath( inputBuffer, rpath );
>>>> - base = basename( rpath );
>>>> -
>>>> - ritr->highSourceLine = std::string( base );
>>>> - }
>>>> -
>>>> - fclose( tmpfile );
>>>> - unlink( "ranges1.tmp" );
>>>> - unlink( "ranges2.tmp" );
>>>> }
>>>>
>>>> SymbolInformation* DesiredSymbols::find(
>>>> diff --git a/tester/covoar/ExecutableInfo.cc
>>>> b/tester/covoar/ExecutableInfo.cc
>>>> index c41d931..1755e93 100644
>>>> --- a/tester/covoar/ExecutableInfo.cc
>>>> +++ b/tester/covoar/ExecutableInfo.cc
>>>> @@ -7,6 +7,8 @@
>>>>
>>>> #include <stdio.h>
>>>>
>>>> +#include <rld.h>
>>>> +
>>>> #include "ExecutableInfo.h"
>>>> #include "app_common.h"
>>>> #include "CoverageMap.h"
>>>> @@ -18,24 +20,36 @@ namespace Coverage {
>>>> ExecutableInfo::ExecutableInfo(
>>>> const char* const theExecutableName,
>>>> const char* const theLibraryName
>>>> - )
>>>> + ) : executable(theExecutableName),
>>>> + loadAddress(0)
>>>> {
>>>> - executableName = theExecutableName;
>>>> - loadAddress = 0;
>>>> - libraryName = "";
>>>> if (theLibraryName)
>>>> libraryName = theLibraryName;
>>>> - theSymbolTable = new SymbolTable();
>>>> + try {
>>>> + executable.open();
>>>> + executable.begin();
>>>> + executable.load_symbols(symbols);
>>>> + debug.begin(executable.elf());
>>>> + debug.load_debug();
>>>> + } catch (rld::error re) {
>>>> + std::cerr << "error: "
>>>> + << re.where << ": " << re.what
>>>> + << std::endl;
>>>> + exit(2);
>>>> + } catch (...) {
>>>> + exit(2);
>>>> + }
>>>> }
>>>>
>>>> ExecutableInfo::~ExecutableInfo()
>>>> {
>>>> - if (theSymbolTable)
>>>> - delete theSymbolTable;
>>>> + debug.end();
>>>> + executable.end();
>>>> + executable.close();
>>>> }
>>>>
>>>> void ExecutableInfo::dumpCoverageMaps( void ) {
>>>> - ExecutableInfo::coverageMaps_t::iterator itr;
>>>> + ExecutableInfo::CoverageMaps::iterator itr;
>>>>
>>>> for (itr = coverageMaps.begin(); itr != coverageMaps.end(); itr++)
>>>> {
>>>> fprintf( stderr, "Coverage Map for %s\n", ((*itr).first).c_str()
>>>> );;
>>>> @@ -44,21 +58,22 @@ namespace Coverage {
>>>> }
>>>>
>>>> void ExecutableInfo::dumpExecutableInfo( void ){
>>>> - fprintf( stdout, "\n== Executable info ==\n");
>>>> - fprintf( stdout, "executableName = %s\n", executableName.c_str());
>>>> - fprintf( stdout, "libraryName = %s\n", libraryName.c_str());
>>>> - fprintf( stdout, "loadAddress = %u\n", loadAddress);
>>>> - theSymbolTable->dumpSymbolTable();
>>>> + std::cout << std::endl
>>>> + << "== Executable info ==" << std::endl
>>>> + << "executable = " << getFileName () << std::endl
>>>> + << "library = " << libraryName << std::endl
>>>> + << "loadAddress = " << loadAddress << std::endl;
>>>> + theSymbolTable.dumpSymbolTable();
>>>> }
>>>>
>>>> CoverageMapBase* ExecutableInfo::getCoverageMap ( uint32_t address )
>>>> {
>>>> - CoverageMapBase* aCoverageMap = NULL;
>>>> - coverageMaps_t::iterator it;
>>>> - std::string itsSymbol;
>>>> + CoverageMapBase* aCoverageMap = NULL;
>>>> + CoverageMaps::iterator it;
>>>> + std::string itsSymbol;
>>>>
>>>> // Obtain the coverage map containing the specified address.
>>>> - itsSymbol = theSymbolTable->getSymbol( address );
>>>> + itsSymbol = theSymbolTable.getSymbol( address );
>>>> if (itsSymbol != "") {
>>>> it = coverageMaps.find( itsSymbol );
>>>> aCoverageMap = (*it).second;
>>>> @@ -67,12 +82,12 @@ namespace Coverage {
>>>> return aCoverageMap;
>>>> }
>>>>
>>>> - const std::string& ExecutableInfo::getFileName ( void ) const
>>>> + const std::string ExecutableInfo::getFileName ( void ) const
>>>> {
>>>> - return executableName;
>>>> + return executable.name().full();
>>>> }
>>>>
>>>> - const std::string& ExecutableInfo::getLibraryName( void ) const
>>>> + const std::string ExecutableInfo::getLibraryName( void ) const
>>>> {
>>>> return libraryName;
>>>> }
>>>> @@ -83,9 +98,9 @@ namespace Coverage {
>>>> }
>>>>
>>>>
>>>> - SymbolTable* ExecutableInfo::getSymbolTable ( void ) const
>>>> + SymbolTable* ExecutableInfo::getSymbolTable ( void )
>>>> {
>>>> - return theSymbolTable;
>>>> + return &theSymbolTable;
>>>> }
>>>>
>>>> CoverageMapBase* ExecutableInfo::createCoverageMap (
>>>> @@ -95,8 +110,8 @@ namespace Coverage {
>>>> uint32_t highAddress
>>>> )
>>>> {
>>>> - CoverageMapBase *theMap;
>>>> - ExecutableInfo::coverageMaps_t::iterator itr;
>>>> + CoverageMapBase *theMap;
>>>> + ExecutableInfo::CoverageMaps::iterator itr;
>>>>
>>>> itr = coverageMaps.find( symbolName );
>>>> if ( itr == coverageMaps.end() ) {
>>>> @@ -109,13 +124,26 @@ namespace Coverage {
>>>> return theMap;
>>>> }
>>>>
>>>> + void ExecutableInfo::getSourceAndLine(
>>>> + const unsigned int address,
>>>> + std::string& line
>>>> + )
>>>> + {
>>>> + std::string file;
>>>> + int lno;
>>>> + debug.get_source (address, file, lno);
>>>> + std::ostringstream ss;
>>>> + ss << file << ':' << lno;
>>>> + line = ss.str ();
>>>> + }
>>>> +
>>>> bool ExecutableInfo::hasDynamicLibrary( void )
>>>> {
>>>> - return (libraryName != "");
>>>> + return !libraryName.empty();
>>>> }
>>>>
>>>> void ExecutableInfo::mergeCoverage( void ) {
>>>> - ExecutableInfo::coverageMaps_t::iterator itr;
>>>> + ExecutableInfo::CoverageMaps::iterator itr;
>>>>
>>>> for (itr = coverageMaps.begin(); itr != coverageMaps.end(); itr++)
>>>> {
>>>> SymbolsToAnalyze->mergeCoverageMap( (*itr).first, (*itr).second
>>>> );
>>>> diff --git a/tester/covoar/ExecutableInfo.h
>>>> b/tester/covoar/ExecutableInfo.h
>>>> index 20ea9bf..9106db3 100644
>>>> --- a/tester/covoar/ExecutableInfo.h
>>>> +++ b/tester/covoar/ExecutableInfo.h
>>>> @@ -11,6 +11,10 @@
>>>> #include <stdint.h>
>>>> #include <string>
>>>>
>>>> +#include <rld-dwarf.h>
>>>> +#include <rld-files.h>
>>>> +#include <rld-symbols.h>
>>>> +
>>>> #include "CoverageMapBase.h"
>>>> #include "SymbolTable.h"
>>>>
>>>> @@ -67,14 +71,14 @@ namespace Coverage {
>>>> *
>>>> * @return Returns the executable's file name
>>>> */
>>>> - const std::string& getFileName( void ) const;
>>>> + const std::string getFileName( void ) const;
>>>>
>>>> /*!
>>>> * This method returns the library name associated with the
>>>> executable.
>>>> *
>>>> * @return Returns the executable's library name
>>>> */
>>>> - const std::string& getLibraryName( void ) const;
>>>> + const std::string getLibraryName( void ) const;
>>>>
>>>> /*!
>>>> * This method returns the load address of the dynamic library
>>>> @@ -88,7 +92,7 @@ namespace Coverage {
>>>> *
>>>> * @return Returns a pointer to the symbol table.
>>>> */
>>>> - SymbolTable* getSymbolTable( void ) const;
>>>> + SymbolTable* getSymbolTable( void );
>>>>
>>>> /*!
>>>> * This method creates a coverage map for the specified symbol.
>>>> @@ -107,6 +111,15 @@ namespace Coverage {
>>>> uint32_t highAddress
>>>> );
>>>>
>>>> + /*!
>>>> + * This method gets the source location, the file and line number
>>>> given an
>>>> + * address.
>>>> + */
>>>> + void getSourceAndLine(
>>>> + const unsigned int address,
>>>> + std::string& location
>>>> + );
>>>> +
>>>> /*!
>>>> * This method indicates whether a dynamic library has been
>>>> * associated with the executable.
>>>> @@ -132,15 +145,25 @@ namespace Coverage {
>>>> private:
>>>>
>>>> /*!
>>>> - * This map associates a symbol with its coverage map.
>>>> + * The ELF executable.
>>>> */
>>>> - typedef std::map<std::string, CoverageMapBase *> coverageMaps_t;
>>>> - coverageMaps_t coverageMaps;
>>>> + rld::files::object executable;
>>>>
>>>> /*!
>>>> - * This member variable contains the name of the executable.
>>>> + * The DWARF data to the ELF executable.
>>>> + */
>>>> + rld::dwarf::file debug;
>>>> +
>>>> + /*!
>>>> + * The executable's symbol table.
>>>> + */
>>>> + rld::symbols::table symbols;
>>>> +
>>>> + /*!
>>>> + * This map associates a symbol with its coverage map.
>>>> */
>>>> - std::string executableName;
>>>> + typedef std::map<std::string, CoverageMapBase *> CoverageMaps;
>>>> + CoverageMaps coverageMaps;
>>>>
>>>> /*!
>>>> * This member variable contains the name of a dynamic library
>>>> @@ -158,7 +181,7 @@ namespace Coverage {
>>>> * This member variable contains a pointer to the symbol table
>>>> * of the executable or library.
>>>> */
>>>> - SymbolTable* theSymbolTable;
>>>> + SymbolTable theSymbolTable;
>>>>
>>>> };
>>>> }
>>>> diff --git a/tester/covoar/covoar.cc b/tester/covoar/covoar.cc
>>>> index 5c87402..09c86c2 100644
>>>> --- a/tester/covoar/covoar.cc
>>>> +++ b/tester/covoar/covoar.cc
>>>> @@ -186,7 +186,7 @@ int main(
>>>> Coverage::ExecutableInfo* executableInfo = NULL;
>>>> std::string executableExtension = "exe";
>>>> std::string coverageExtension = "cov";
>>>> - Coverage::CoverageFormats_t coverageFormat;
>>>> + Coverage::CoverageFormats_t coverageFormat =
>>>> Coverage::COVERAGE_FORMAT_QEMU;
>>>> Coverage::CoverageReaderBase* coverageReader = NULL;
>>>> char* executable = NULL;
>>>> const char* explanations = NULL;
>>>> diff --git a/tester/covoar/wscript b/tester/covoar/wscript
>>>> index c0270d8..55d5ec9 100644
>>>> --- a/tester/covoar/wscript
>>>> +++ b/tester/covoar/wscript
>>>> @@ -70,7 +70,7 @@ def build(bld):
>>>> #
>>>> # The list of modules.
>>>> #
>>>> - modules = ['rld', 'elf', 'iberty']
>>>> + modules = ['rld', 'dwarf', 'elf', 'iberty']
>>>>
>>>> bld.stlib(target = 'ccovoar',
>>>> source = ['app_common.cc',
>>>> --
>>>> 2.15.1
>>>>
>>>> _______________________________________________
>>>> devel mailing list
>>>> devel at rtems.org
>>>> http://lists.rtems.org/mailman/listinfo/devel
>>>>
>>>
>>> _______________________________________________
>>> devel mailing list
>>> devel at rtems.org
>>> http://lists.rtems.org/mailman/listinfo/devel
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20180505/bb8e4412/attachment-0002.html>
More information about the devel
mailing list