rtems-tools/linkers/rtems-ld.cpp rtems-tools/linkers/rtems-ra.cpp rtems-tools/linkers/rtems-rapper.cpp rtems-tools/linkers/wscript rtems-tools/rtemstoolkit/rld-compression.cpp rtems-tools/rtemstoolkit/rld-compression.h rtems-tools/rtemstoolkit/rld-outputter.cpp rtems-tools/rtemstoolkit/rld-outputter.h rtems-tools/rtemstoolkit/rld-rap.cpp rtems-tools/rtemstoolkit/rld-rap.h
diff -Naur rtems-tools/linkers/rtems-ld.cpp rtems-tools_patched/linkers/rtems-ld.cpp --- rtems-tools/linkers/rtems-ld.cpp 2018-12-03 11:40:06 +0400 +++ rtems-tools_patched/linkers/rtems-ld.cpp 2019-02-21 16:07:57 +0400 @@ -76,6 +76,7 @@ { "one-file", no_argument, NULL, 's' }, { "rtems", required_argument, NULL, 'r' }, { "rtems-bsp", required_argument, NULL, 'B' }, + { "compress", required_argument, NULL, 'z' }, { NULL, 0, NULL, 0 } }; @@ -119,6 +120,7 @@ << " -R : include file paths (also --rpath)" << std::endl << " -P : place objects from archives (also --runtime-lib)" << std::endl << " -s : Include archive elf object files (also --one-file)" << std::endl + << " -z : Compression algorithm 0,1,2 (default 1) NONE, LZ77, ZLIB" << std::endl << " -Wl,opts : link compatible flags, ignored" << std::endl << " -r path : RTEMS path (also --rtems)" << std::endl << " -B bsp : RTEMS arch/bsp (also --rtems-bsp)" << std::endl @@ -192,6 +194,7 @@ std::string output = "a.out"; std::string outra; std::string base_name; + std::string algorithm = "1"; std::string output_type = "rap"; bool standard_libs = true; bool map = false; @@ -204,7 +207,7 @@ while (true) { - int opt = ::getopt_long (argc, argv, "hvwVMnsSb:E:o:O:L:l:c:e:d:u:C:W:R:P:r:B:", rld_opts, NULL); + int opt = ::getopt_long (argc, argv, "hvwVMnsSb:E:o:O:L:l:c:e:d:u:z:C:W:R:P:r:B:", rld_opts, NULL); if (opt < 0) break; @@ -301,6 +304,10 @@ base_name = optarg; break; + case 'z': + algorithm = optarg; + break; + case 'S': rld::rap::add_obj_details = false; break; @@ -504,9 +511,13 @@ dependents, cache); else if (output_type == "rap") { - rld::outputter::rap_application (output, entry, exit, - dependents, cache, symbols, - one_file); + int i = atoi(algorithm.c_str()); + + if ((i < 0) || (i > 2)) + rld::error("Unknown compression", "output"); + + rld::outputter::rap_application(output, entry, exit, dependents, + cache, symbols, one_file, i); if (!outra.empty ()) { rld::path::paths ra_libs; diff -Naur rtems-tools/linkers/rtems-ra.cpp rtems-tools_patched/linkers/rtems-ra.cpp --- rtems-tools/linkers/rtems-ra.cpp 2018-12-03 11:40:06 +0400 +++ rtems-tools_patched/linkers/rtems-ra.cpp 2019-02-21 16:08:04 +0400 @@ -376,8 +376,8 @@ /* Todo: include absolute name for rap_name */ rld::outputter::rap_application (rap_name, entry, exit, - dependents, *cache, symbols, - true); + dependents, *cache, symbols, + true, 1); } dependents.clear (); diff -Naur rtems-tools/linkers/rtems-rapper.cpp rtems-tools_patched/linkers/rtems-rapper.cpp --- rtems-tools/linkers/rtems-rapper.cpp 2018-12-03 11:40:05 +0400 +++ rtems-tools_patched/linkers/rtems-rapper.cpp 2019-02-21 14:36:07 +0400 @@ -468,6 +468,14 @@ rhdr_compression = "LZ77"; eptr = sptr + 4; } + else if ((sptr[0] == 'Z') && + (sptr[1] == 'L') && + (sptr[2] == 'I') && + (sptr[3] == 'B')) + { + rhdr_compression = "ZLIB"; + eptr = sptr + 4; + } else throw rld::error ("Cannot parse RAP header", "open: " + name); @@ -543,8 +551,15 @@ file::load () { image.seek (rhdr_len); + int i; + if (rhdr_compression == "NONE") + i = 0; + if (rhdr_compression == "LZ77") + i = 1; + if (rhdr_compression == "ZLIB") + i = 2; - rld::compress::compressor comp (image, rap_comp_buffer, false); + rld::compress::compressor comp (image, rap_comp_buffer, false, i); /* * uint32_t: machinetype @@ -645,7 +660,15 @@ image.seek (rhdr_len); - rld::compress::compressor comp (image, rap_comp_buffer, false); + int i; + if (rhdr_compression == "NONE") + i = 0; + if (rhdr_compression == "LZ77") + i = 1; + if (rhdr_compression == "ZLIB") + i = 2; + rld::compress::compressor comp (image, rap_comp_buffer, false, i); + rld::files::image out (name); out.open (true); diff -Naur rtems-tools/linkers/wscript rtems-tools_patched/linkers/wscript --- rtems-tools/linkers/wscript 2018-06-19 10:43:47 +0400 +++ rtems-tools_patched/linkers/wscript 2019-02-21 14:28:43 +0400 @@ -90,6 +90,7 @@ cflags = conf['cflags'] + conf['warningflags'], cxxflags = conf['cxxflags'] + conf['warningflags'], linkflags = conf['linkflags'], + lib = ['z'], use = modules) # @@ -102,6 +103,7 @@ cflags = conf['cflags'] + conf['warningflags'], cxxflags = conf['cxxflags'] + conf['warningflags'], linkflags = conf['linkflags'], + lib = ['z'], use = modules) # @@ -140,6 +142,7 @@ cflags = conf['cflags'] + conf['warningflags'], cxxflags = conf['cxxflags'] + conf['warningflags'], linkflags = conf['linkflags'], + lib = ['z'], use = modules) # @@ -152,6 +155,7 @@ cflags = conf['cflags'] + conf['warningflags'], cxxflags = conf['cxxflags'] + conf['warningflags'], linkflags = conf['linkflags'], + lib = ['z'], use = modules) # diff -Naur rtems-tools/rtemstoolkit/rld-compression.cpp rtems-tools_patched/rtemstoolkit/rld-compression.cpp --- rtems-tools/rtemstoolkit/rld-compression.cpp 2017-09-18 15:01:39 +0400 +++ rtems-tools_patched/rtemstoolkit/rld-compression.cpp 2019-02-21 16:08:37 +0400 @@ -35,8 +35,18 @@ #include <rld.h> #include <rld-compression.h> +#include <zlib.h> #include "fastlz.h" +static int ret_z; +static unsigned have_z, wr, count_z; +static z_stream strm; +static unsigned char *in_z; +static unsigned char *out_z; +static unsigned char *ptr_in; +static unsigned char *ptr_out; +#define CHUNK 16384 + namespace rld { namespace compress @@ -44,7 +54,7 @@ compressor::compressor (files::image& image, size_t size, bool out, - bool compress) + int compress) : image (image), size (size), out (out), @@ -234,32 +244,64 @@ void compressor::output (bool forced) { - if (out && ((forced && level) || (level >= size))) - { - if (compress) + if (out && ((forced && level) || (level >= size))) { - int writing = ::fastlz_compress (buffer, level, io); - uint8_t header[2]; - - if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG) - std::cout << "rtl: comp: offset=" << total_compressed - << " block-size=" << writing << std::endl; - - header[0] = writing >> 8; - header[1] = writing; - - image.write (header, 2); - image.write (io, writing); - - total_compressed += 2 + writing; + switch (compress) { + case 0: { + image.write(buffer, level); + total_compressed += level; + break; + } + case 1: { + int writing = ::fastlz_compress(buffer, level, io); + uint8_t header[2]; + if (rld::verbose() >= RLD_VERBOSE_FULL_DEBUG) + std::cout << "rtl: comp: offset=" << total_compressed + << " block-size=" << writing << std::endl; + header[0] = writing >> 8; + header[1] = writing; + image.write(header, 2); + image.write(io, writing); + total_compressed += 2 + writing; + break; + } + case 2: { + if (start) + { + start = false; + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + out_z = new uint8_t[CHUNK]; + ret_z = ::deflateInit(&strm, Z_BEST_COMPRESSION); + if (ret_z != Z_OK) + throw rld::error("Invalid init deflate", "compression"); + } + int flush = (forced != 0) ? Z_FINISH : Z_NO_FLUSH; + strm.next_in = buffer; + strm.avail_in = level; + do + { + strm.avail_out = CHUNK; + strm.next_out = out_z; + ret_z = ::deflate(&strm, flush); + if (ret_z == Z_STREAM_ERROR) + throw rld::error("Invalid deflate", "compression"); + have_z = CHUNK - strm.avail_out; + image.write(out_z, have_z); + total_compressed += have_z; + } while (strm.avail_out == 0); + if (forced != 0) + { + start = true; + delete[] out_z; + (void) ::deflateEnd(&strm); + } + break; + } + } + level = 0; } - else - { - image.write (buffer, level); - } - - level = 0; - } } void @@ -267,37 +309,100 @@ { if (!out && (level == 0)) { - if (compress) - { - uint8_t header[2]; - - if (image.read (header, 2) == 2) - { - ssize_t block_size = - (((ssize_t) header[0]) << 8) | (ssize_t) header[1]; - - if (block_size == 0) - throw rld::error ("Block size is invalid (0)", "compression"); - - total_compressed += 2 + block_size; - - if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG) - std::cout << "rtl: decomp: block-size=" << block_size - << std::endl; - - if (image.read (io, block_size) != block_size) - throw rld::error ("Read past end", "compression"); - - level = ::fastlz_decompress (io, block_size, buffer, size); + switch (compress) { + case 0: { + level = image.read(buffer, size); + total_compressed += level; + break; + } + case 1: { + uint8_t header[2]; + if (image.read(header, 2) == 2) + { + uint32_t block_size = (((uint32_t) header[0]) << 8) | (uint32_t) header[1]; + if (block_size == 0) + throw rld::error("Block size is invalid (0)", "uncompression"); + total_compressed += 2 + block_size; + if (rld::verbose() >= RLD_VERBOSE_FULL_DEBUG) + std::cout << "rtl: decomp: block-size=" << block_size << std::endl; + if ((uint32_t) image.read(io, block_size) != block_size) + throw rld::error("Read past end", "uncompression"); + level = ::fastlz_decompress(io, block_size, buffer, size); + } + break; + } + case 2: { + if (start) + { + start = false; + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret_z = inflateInit(&strm); + if (ret_z != Z_OK) + throw rld::error("Invalid init inflate", "uncompression"); + out_z = new uint8_t[CHUNK]; + in_z = new uint8_t[CHUNK]; + have_z = 0; + count_z = 0; + } + ptr_out = buffer; + wr = 0; + while (1) { + if (have_z > 0) + { + wr = have_z > (size - (ptr_out - buffer)) ? size - (ptr_out - buffer) : have_z; + memcpy(ptr_out, ptr_in, wr); + ptr_out += wr; + ptr_in += wr; + have_z -= wr; + if ((size_t)(ptr_out - buffer) == size) + break; + } else + { + if (strm.avail_in == 0) + { + strm.avail_in = image.read(in_z, CHUNK); + count_z += strm.avail_in; + strm.next_in = in_z; + } + if (strm.avail_in == 0) + break; + } + strm.avail_out = CHUNK; + strm.next_out = out_z; + ptr_in = out_z; + ret_z = inflate(&strm, Z_NO_FLUSH); + if ((ret_z == Z_STREAM_ERROR) || (ret_z == Z_NEED_DICT) || + (ret_z == Z_DATA_ERROR) || (ret_z == Z_MEM_ERROR)) + { + delete[] out_z; + delete[] in_z; + (void) inflateEnd(&strm); + throw rld::error("Invalid inflate", "uncompression"); + } + have_z = CHUNK - strm.avail_out; + if (have_z > 0) + { + wr = have_z > (size - (ptr_out - buffer)) ? size - (ptr_out - buffer) : have_z; + memcpy(ptr_out, ptr_in, wr); + ptr_out += wr; + ptr_in += wr; + have_z -= wr; + if ((size_t)(ptr_out - buffer) == size) + break; + } + } + level = ptr_out - buffer; + total_compressed += count_z; + count_z = 0; + break; } } - else - { - image.read (buffer, size); - level = size; - } - } } } } +} diff -Naur rtems-tools/rtemstoolkit/rld-compression.h rtems-tools_patched/rtemstoolkit/rld-compression.h --- rtems-tools/rtemstoolkit/rld-compression.h 2016-01-13 15:35:31 +0400 +++ rtems-tools_patched/rtemstoolkit/rld-compression.h 2019-02-21 14:40:07 +0400 @@ -48,7 +48,7 @@ compressor (files::image& image, size_t size, bool out = true, - bool compress = true); + int compress = 1); /** * Destruct the compressor. @@ -147,7 +147,7 @@ files::image& image; //< The image to read or write to or from. size_t size; //< The size of the buffer. bool out; //< If true the it is compression. - bool compress; //< If true compress the data. + int compress; //< The type of compressor the data. uint8_t* buffer; //< The decompressed buffer uint8_t* io; //< The I/O buffer. size_t level; //< The amount of data in the buffer. @@ -155,6 +155,7 @@ // transferred. size_t total_compressed; //< The amount of compressed data // transferred. + bool start; }; /** diff -Naur rtems-tools/rtemstoolkit/rld-outputter.cpp rtems-tools_patched/rtemstoolkit/rld-outputter.cpp --- rtems-tools/rtemstoolkit/rld-outputter.cpp 2018-04-18 10:52:00 +0400 +++ rtems-tools_patched/rtemstoolkit/rld-outputter.cpp 2019-02-21 14:41:49 +0400 @@ -435,7 +435,8 @@ const files::object_list& dependents, const files::cache& cache, const symbols::table& symbols, - bool one_file) + bool one_file, + int algorithm) { if (rld::verbose () >= RLD_VERBOSE_INFO) std::cout << "outputter:application: " << name << std::endl; @@ -456,7 +457,7 @@ try { - rap::write (app, entry, exit, objects, symbols); + rap::write (app, entry, exit, objects, symbols, algorithm); } catch (...) { diff -Naur rtems-tools/rtemstoolkit/rld-outputter.h rtems-tools_patched/rtemstoolkit/rld-outputter.h --- rtems-tools/rtemstoolkit/rld-outputter.h 2018-04-18 10:52:00 +0400 +++ rtems-tools_patched/rtemstoolkit/rld-outputter.h 2019-02-21 14:42:55 +0400 @@ -117,7 +117,8 @@ const files::object_list& dependents, const files::cache& cache, const symbols::table& symbols, - bool one_file); + bool one_file, + int algorithm); } } diff -Naur rtems-tools/rtemstoolkit/rld-rap.cpp rtems-tools_patched/rtemstoolkit/rld-rap.cpp --- rtems-tools/rtemstoolkit/rld-rap.cpp 2018-04-18 10:52:00 +0400 +++ rtems-tools_patched/rtemstoolkit/rld-rap.cpp 2019-02-21 14:46:37 +0400 @@ -1684,15 +1684,22 @@ const std::string& init, const std::string& fini, const files::object_list& app_objects, - const symbols::table& /* symbols */) /* Add back for incremental - * linking */ + const symbols::table&, /* symbols */ /* Add back for incremental + * linking */ + int type_compress) { std::string header; + + if (type_compress == 0) + header = "RAP,00000000,0002,NONE,00000000\n"; + if (type_compress == 1) + header = "RAP,00000000,0002,LZ77,00000000\n"; + if (type_compress == 2) + header = "RAP,00000000,0002,ZLIB,00000000\n"; - header = "RAP,00000000,0002,LZ77,00000000\n"; app.write (header.c_str (), header.size ()); - compress::compressor compressor (app, 2 * 1024); + compress::compressor compressor (app, 2 * 1024, true, type_compress); image rap; rap.layout (app_objects, init, fini); diff -Naur rtems-tools/rtemstoolkit/rld-rap.h rtems-tools_patched/rtemstoolkit/rld-rap.h --- rtems-tools/rtemstoolkit/rld-rap.h 2016-01-13 15:35:31 +0400 +++ rtems-tools_patched/rtemstoolkit/rld-rap.h 2019-02-21 14:46:12 +0400 @@ -90,7 +90,8 @@ const std::string& init, const std::string& fini, const files::object_list& objects, - const symbols::table& symbols); + const symbols::table& symbols, + int compress); } }
_______________________________________________ users mailing list users@rtems.org http://lists.rtems.org/mailman/listinfo/users