1a85fe12eSEd Maste.\" Copyright (c) 2008-2009,2011 Joseph Koshy. All rights reserved. 2a85fe12eSEd Maste.\" 3a85fe12eSEd Maste.\" Redistribution and use in source and binary forms, with or without 4a85fe12eSEd Maste.\" modification, are permitted provided that the following conditions 5a85fe12eSEd Maste.\" are met: 6a85fe12eSEd Maste.\" 1. Redistributions of source code must retain the above copyright 7a85fe12eSEd Maste.\" notice, this list of conditions and the following disclaimer. 8a85fe12eSEd Maste.\" 2. Redistributions in binary form must reproduce the above copyright 9a85fe12eSEd Maste.\" notice, this list of conditions and the following disclaimer in the 10a85fe12eSEd Maste.\" documentation and/or other materials provided with the distribution. 11a85fe12eSEd Maste.\" 12a85fe12eSEd Maste.\" This software is provided by Joseph Koshy ``as is'' and 13a85fe12eSEd Maste.\" any express or implied warranties, including, but not limited to, the 14a85fe12eSEd Maste.\" implied warranties of merchantability and fitness for a particular purpose 15a85fe12eSEd Maste.\" are disclaimed. in no event shall Joseph Koshy be liable 16a85fe12eSEd Maste.\" for any direct, indirect, incidental, special, exemplary, or consequential 17a85fe12eSEd Maste.\" damages (including, but not limited to, procurement of substitute goods 18a85fe12eSEd Maste.\" or services; loss of use, data, or profits; or business interruption) 19a85fe12eSEd Maste.\" however caused and on any theory of liability, whether in contract, strict 20a85fe12eSEd Maste.\" liability, or tort (including negligence or otherwise) arising in any way 21a85fe12eSEd Maste.\" out of the use of this software, even if advised of the possibility of 22a85fe12eSEd Maste.\" such damage. 23a85fe12eSEd Maste.\" 24*ae500c1fSEd Maste.\" $Id: elfcopy.1 3642 2018-10-14 14:24:28Z jkoshy $ 25a85fe12eSEd Maste.\" 26715d1396SEd Maste.Dd August 30, 2017 27a85fe12eSEd Maste.Dt ELFCOPY 1 28*ae500c1fSEd Maste.Os 29a85fe12eSEd Maste.Sh NAME 30839529caSEd Maste.Nm elfcopy , 31839529caSEd Maste.Nm objcopy 32a85fe12eSEd Maste.Nd copy and translate object files 33a85fe12eSEd Maste.Sh SYNOPSIS 34a85fe12eSEd Maste.Nm 35a85fe12eSEd Maste.Op Fl I Ar objformat | Fl s Ar objformat | Fl -input-target= Ns Ar objformat 36a85fe12eSEd Maste.Op Fl K Ar symbolname | Fl -keep-symbol= Ns Ar symbolname 37a85fe12eSEd Maste.Op Fl L Ar symbolname | Fl -localize-symbol= Ns Ar symbolname 38a85fe12eSEd Maste.Op Fl N Ar symbolname | Fl -strip-symbol= Ns Ar symbolname 39a85fe12eSEd Maste.Op Fl O Ar objformat | Fl -output-target= Ns Ar objformat 40a85fe12eSEd Maste.Op Fl R Ar sectionname | Fl -remove-section= Ns Ar sectionname 41a85fe12eSEd Maste.Op Fl S | Fl -strip-all 42a85fe12eSEd Maste.Op Fl V | Fl -version 43a85fe12eSEd Maste.Op Fl W Ar symbolname | Fl -weaken-symbol= Ns Ar symbolname 44a85fe12eSEd Maste.Op Fl X | Fl -discard-locals 45a85fe12eSEd Maste.Op Fl d | Fl g | Fl -strip-debug 46a85fe12eSEd Maste.Op Fl h | Fl -help 47a85fe12eSEd Maste.Op Fl j Ar sectionname | Fl -only-section= Ns Ar sectionname 48a85fe12eSEd Maste.Op Fl p | Fl -preserve-dates 49a85fe12eSEd Maste.Op Fl w | Fl -wildcard 50a85fe12eSEd Maste.Op Fl x | Fl -discard-all 5195fd7f26SEd Maste.Op Fl -add-gnu-debuglink Ns = Ns Ar filename 52a85fe12eSEd Maste.Op Fl -add-section Ar sectionname Ns = Ns Ar filename 53a85fe12eSEd Maste.Oo 54a85fe12eSEd Maste.Fl -adjust-section-vma Ar section Ns {+|-|=} Ns Ar val | 55a85fe12eSEd Maste.Fl -change-section-address Ar section Ns {+|-|=} Ns Ar val 56a85fe12eSEd Maste.Oc 57a85fe12eSEd Maste.Oo 58a85fe12eSEd Maste.Fl -adjust-start Ns = Ns Ar increment | 59a85fe12eSEd Maste.Fl -change-start Ns = Ns Ar increment 60a85fe12eSEd Maste.Oc 61a85fe12eSEd Maste.Oo 62a85fe12eSEd Maste.Fl -adjust-vma Ns = Ns Ar increment | 63a85fe12eSEd Maste.Fl -change-addresses Ns = Ns Ar increment 64a85fe12eSEd Maste.Oc 65a85fe12eSEd Maste.Op Fl -adjust-warnings | Fl -change-warnings 66a85fe12eSEd Maste.Op Fl -change-section-lma Ar section Ns {+|-|=} Ns Ar val 67a85fe12eSEd Maste.Op Fl -change-section-vma Ar section Ns {+|-|=} Ns Ar val 6867d97fe7SEd Maste.Op Fl -extract-dwo 69a85fe12eSEd Maste.Op Fl -gap-fill Ns = Ns Ar val 70b6b6f9ccSEd Maste.Op Fl -globalize-symbol Ns = Ns ar symbolname 71b6b6f9ccSEd Maste.Op Fl -globalize-symbols Ns = Ns Ar filename 7267d97fe7SEd Maste.Op Fl -localize-hidden 73b6b6f9ccSEd Maste.Op Fl -localize-symbols Ns = Ns Ar filename 74a85fe12eSEd Maste.Op Fl -no-adjust-warnings | Fl -no-change-warnings 75a85fe12eSEd Maste.Op Fl -only-keep-debug 76a85fe12eSEd Maste.Op Fl -pad-to Ns = Ns Ar address 77a85fe12eSEd Maste.Op Fl -prefix-alloc-sections Ns = Ns Ar string 78a85fe12eSEd Maste.Op Fl -prefix-sections Ns = Ns Ar string 79a85fe12eSEd Maste.Op Fl -prefix-symbols Ns = Ns Ar string 80a85fe12eSEd Maste.Op Fl -rename-section Ar oldname Ns = Ns Ar newname Ns Op Ar ,flags 81a85fe12eSEd Maste.Op Fl -set-section-flags Ar sectionname Ns = Ns Ar flags 82a85fe12eSEd Maste.Op Fl -set-start Ns = Ns Ar address 83a85fe12eSEd Maste.Op Fl -srec-forceS3 84a85fe12eSEd Maste.Op Fl -srec-len Ns = Ns Ar val 8567d97fe7SEd Maste.Op Fl -strip-dwo 86431bcfcdSEd Maste.Op Fl -strip-symbols= Ns Ar filename 87a85fe12eSEd Maste.Op Fl -strip-unneeded 88a85fe12eSEd Maste.Ar infile 89a85fe12eSEd Maste.Op Ar outfile 90a85fe12eSEd Maste.Sh DESCRIPTION 91a85fe12eSEd MasteThe 92a85fe12eSEd Maste.Nm 93839529caSEd Masteutility copies the content of the binary object named by argument 94a85fe12eSEd Maste.Ar infile 95a85fe12eSEd Masteto that named by argument 96a85fe12eSEd Maste.Ar outfile , 97a85fe12eSEd Mastetransforming it according to the command line options specified. 98a85fe12eSEd MasteIf argument 99a85fe12eSEd Maste.Ar outfile 100a85fe12eSEd Masteis not specified, 101a85fe12eSEd Maste.Nm 102a85fe12eSEd Mastewill create a temporary file and will subsequently rename it as 103a85fe12eSEd Maste.Ar infile . 104a85fe12eSEd Maste.Pp 105a85fe12eSEd MasteThe 106a85fe12eSEd Maste.Nm 107a85fe12eSEd Masteutility supports the following options: 108a85fe12eSEd Maste.Bl -tag -width indent 109a85fe12eSEd Maste.It Fl I Ar objformat | Fl s Ar objformat | Fl -input-target= Ns Ar objformat 110a85fe12eSEd MasteSpecify that the input file named by the argument 111a85fe12eSEd Maste.Ar infile 112a85fe12eSEd Masteis in the object format specified by the argument 113a85fe12eSEd Maste.Ar objformat . 114a85fe12eSEd Maste.It Fl K Ar symbolname | Fl -keep-symbol= Ns Ar symbolname 115a85fe12eSEd MasteCopy the symbol named by argument 116a85fe12eSEd Maste.Ar symbolname 117a85fe12eSEd Masteto the output. 118a85fe12eSEd Maste.It Fl L Ar symbolname | Fl -localize-symbol= Ns Ar symbolname 119a85fe12eSEd MasteMake the symbol named by argument 120a85fe12eSEd Maste.Ar symbolname 121a85fe12eSEd Mastelocal to the output file. 122a85fe12eSEd Maste.It Fl N Ar symbol | Fl -strip-symbol= Ns Ar symbolname 123a85fe12eSEd MasteDo not copy the symbol named by argument 124a85fe12eSEd Maste.Ar symbolname 125a85fe12eSEd Masteto the output. 126a85fe12eSEd Maste.It Fl O Ar objformat | Fl -output-target= Ns Ar objformat 127a85fe12eSEd MasteWrite the output file using the object format specified in argument 128a85fe12eSEd Maste.Ar objformat . 129839529caSEd MasteThe argument 130839529caSEd Maste.Ar objformat 131839529caSEd Masteshould be one of the target names recognized by 132839529caSEd Maste.Xr elftc_bfd_find_target 3 . 133a85fe12eSEd Maste.It Fl R Ar sectionname | Fl -remove-section= Ns Ar sectionname 134a85fe12eSEd MasteRemove any section with name 135a85fe12eSEd Maste.Ar sectionname 136a85fe12eSEd Mastefrom the output file. 137a85fe12eSEd Maste.It Fl S | Fl -strip-all 138a85fe12eSEd MasteDo not copy symbol and relocation information to the target file. 139a85fe12eSEd Maste.It Fl V | Fl -version 140a85fe12eSEd MastePrint a version identifier and exit. 141a85fe12eSEd Maste.It Fl W Ar symbolname | Fl -weaken-symbol= Ns Ar symbolname 142a85fe12eSEd MasteMark the symbol named by argument 143a85fe12eSEd Maste.Ar symbolname 144a85fe12eSEd Masteas weak in the output. 145a85fe12eSEd Maste.It Fl X | Fl -discard-locals 146a85fe12eSEd MasteDo not copy compiler generated local symbols to the output. 147a85fe12eSEd Maste.It Fl d | Fl g | Fl -strip-debug 148a85fe12eSEd MasteDo not copy debugging information to the target file. 149a85fe12eSEd Maste.It Fl h | Fl -help 150a85fe12eSEd MasteDisplay a help message and exit. 151a85fe12eSEd Maste.It Fl j Ar sectionname | Fl -only-section= Ns Ar sectionname 152a85fe12eSEd MasteCopy only the section named by argument 153a85fe12eSEd Maste.Ar sectionname 154a85fe12eSEd Masteto the output. 155a85fe12eSEd Maste.It Fl p | Fl -preserve-dates 156a85fe12eSEd MasteSet the access and modification times of the output file to the 157a85fe12eSEd Mastesame as those of the input. 158a85fe12eSEd Maste.It Fl w | Fl -wildcard 159a85fe12eSEd MasteUse shell-style patterns to name symbols. 160a85fe12eSEd MasteThe following meta-characters are recognized in patterns: 161a85fe12eSEd Maste.Bl -tag -width "...." -compact 162a85fe12eSEd Maste.It Li ! 163a85fe12eSEd MasteIf this is the first character of the pattern, invert the sense of the 164a85fe12eSEd Mastepattern match. 165a85fe12eSEd Maste.It Li * 166a85fe12eSEd MasteMatches any string of characters in a symbol name. 167a85fe12eSEd Maste.It Li ? 168a85fe12eSEd MasteMatches zero or one character in a symbol name. 169a85fe12eSEd Maste.It Li [ 170a85fe12eSEd MasteMark the start of a character class. 171a85fe12eSEd Maste.It Li \e 172a85fe12eSEd MasteRemove the special meaning of the next character in the pattern. 173a85fe12eSEd Maste.It Li ] 174a85fe12eSEd MasteMark the end of a character class. 175a85fe12eSEd Maste.El 176a85fe12eSEd Maste.It Fl x | Fl -discard-all 177a85fe12eSEd MasteDo not copy non-global symbols to the output. 17895fd7f26SEd Maste.It Fl -add-gnu-debuglink Ns = Ns Ar filename 17995fd7f26SEd MasteCreate a .gnu_debuglink section in the output file that references the 18095fd7f26SEd Mastedebug data in 18195fd7f26SEd Maste.Ar filename . 182a85fe12eSEd Maste.It Fl -add-section Ar sectionname Ns = Ns Ar filename 183a85fe12eSEd MasteAdd a new section to the output file with name 184a85fe12eSEd Maste.Ar sectionname . 185a85fe12eSEd MasteThe contents of the section are taken from the file named by 186a85fe12eSEd Masteargument 187a85fe12eSEd Maste.Ar filename . 188a85fe12eSEd MasteThe size of the section will be the number of bytes in file 189a85fe12eSEd Maste.Ar filename . 190a85fe12eSEd Maste.It Xo 191a85fe12eSEd Maste.Fl -adjust-section-vma Ar section Ns {+|-|=} Ns Ar val | 192a85fe12eSEd Maste.Fl -change-section-address Ar section Ns {+|-|=} Ns Ar val 193a85fe12eSEd Maste.Xc 194a85fe12eSEd MasteDepending on the operator specified, increase, decrease or set both 195a85fe12eSEd Mastethe virtual memory address and the load memory address of the section 196a85fe12eSEd Mastenamed by the argument 197a85fe12eSEd Maste.Ar section . 198a85fe12eSEd MasteThe argument 199a85fe12eSEd Maste.Ar val 200a85fe12eSEd Mastespecifies the desired increment, decrement or new value for the 201a85fe12eSEd Masteaddress. 202a85fe12eSEd Maste.It Xo 203a85fe12eSEd Maste.Fl -adjust-start Ns = Ns Ar increment | 204a85fe12eSEd Maste.Fl -change-start Ns = Ns Ar increment 205a85fe12eSEd Maste.Xc 206a85fe12eSEd MasteIncrease the entry point address of the output ELF object by the value 207a85fe12eSEd Mastespecified in the argument 208a85fe12eSEd Maste.Ar increment . 209a85fe12eSEd Maste.It Xo 210a85fe12eSEd Maste.Fl -adjust-vma Ns = Ns Ar increment | 211a85fe12eSEd Maste.Fl -change-addresses Ns = Ns Ar increment 212a85fe12eSEd Maste.Xc 213a85fe12eSEd MasteIncrease the virtual memory address and the load memory address of all 214a85fe12eSEd Mastesections by the value specified by the argument 215a85fe12eSEd Maste.Ar increment . 216a85fe12eSEd Maste.It Fl -adjust-warnings | Fl -change-warnings 217a85fe12eSEd MasteIssue a warning if the section specified by the options 218a85fe12eSEd Maste.Fl -change-section-address , 219a85fe12eSEd Maste.Fl -change-section-lma 220a85fe12eSEd Masteor 221a85fe12eSEd Maste.Fl -change-section-vma 222a85fe12eSEd Mastedoes not exist in the input object. 223a85fe12eSEd MasteThis is the default. 224a85fe12eSEd Maste.It Fl -change-section-lma Ar section Ns {+|-|=} Ns Ar val 225a85fe12eSEd MasteChange or set the load memory address of the section named by the 226a85fe12eSEd Masteargument 227a85fe12eSEd Maste.Ar section . 228a85fe12eSEd MasteDepending on the operator specified, the value in argument 229a85fe12eSEd Maste.Ar val 230a85fe12eSEd Mastewill be used as an increment, a decrement or as the new value 231a85fe12eSEd Masteof the load memory address. 232a85fe12eSEd Maste.It Fl -change-section-vma Ar section Ns {+|-|=} Ns Ar val 233a85fe12eSEd MasteChange or set the virtual memory address of the section named by the 234a85fe12eSEd Masteargument 235a85fe12eSEd Maste.Ar section . 236a85fe12eSEd MasteDepending on the operator specified, the value in argument 237a85fe12eSEd Maste.Ar val 238a85fe12eSEd Mastewill be used as an increment, a decrement or as the new value 239a85fe12eSEd Masteof the virtual memory address. 24067d97fe7SEd Maste.It Fl -extract-dwo 24167d97fe7SEd MasteCopy only .dwo debug sections to the output file. 242a85fe12eSEd Maste.It Fl -gap-fill Ns = Ns Ar val 243a85fe12eSEd MasteFill the gaps between sections with the byte value specified by 244a85fe12eSEd Mastethe argument 245a85fe12eSEd Maste.Ar val . 246b6b6f9ccSEd Maste.It Fl -globalize-symbol Ns = Ns Ar symbolname 247b6b6f9ccSEd MasteMake the symbol named by argument 248b6b6f9ccSEd Maste.Ar symbolname 249b6b6f9ccSEd Masteglobal, so that it is visible outside of the file in which it is defined. 250b6b6f9ccSEd Maste.It Fl -globalize-symbols Ns = Ns Ar filename 251b6b6f9ccSEd MasteMake each symbol listed in the file specified by 252b6b6f9ccSEd Maste.Ar filename 253b6b6f9ccSEd Masteglobal. 25467d97fe7SEd Maste.It Fl -localize-hidden 25567d97fe7SEd MasteMake all hidden symbols local to the output file. 25667d97fe7SEd MasteThis includes symbols with internal visiblity. 257b6b6f9ccSEd Maste.It Fl -localize-symbols Ns = Ns Ar filename 258b6b6f9ccSEd MasteMake each symbol listed in the file specified by 259b6b6f9ccSEd Maste.Ar filename 260b6b6f9ccSEd Mastelocal to the output file. 261a85fe12eSEd Maste.It Fl -no-adjust-warnings | Fl -no-change-warnings 262a85fe12eSEd MasteDo not issue a warning if the section specified by the options 263a85fe12eSEd Maste.Fl -change-section-address , 264a85fe12eSEd Maste.Fl -change-section-lma 265a85fe12eSEd Masteor 266a85fe12eSEd Maste.Fl -change-section-vma 267a85fe12eSEd Masteis missing in the input object. 268a85fe12eSEd Maste.It Fl -only-keep-debug 269a85fe12eSEd MasteCopy only debugging information to the output file. 270a85fe12eSEd Maste.It Fl -pad-to Ns = Ns Ar address 271a85fe12eSEd MastePad the load memory address of the output object to the value 272a85fe12eSEd Mastespecified by the argument 273a85fe12eSEd Maste.Ar address 274a85fe12eSEd Masteby increasing the size of the section with the highest load memory 275a85fe12eSEd Masteaddress. 276a85fe12eSEd Maste.It Fl -prefix-alloc-sections Ns = Ns Ar string 277a85fe12eSEd MastePrefix the section names of all the allocated sections with 278a85fe12eSEd Maste.Ar string . 279a85fe12eSEd Maste.It Fl -prefix-sections Ns = Ns Ar string 280a85fe12eSEd MastePrefix the section names of all the sections with 281a85fe12eSEd Maste.Ar string . 282a85fe12eSEd Maste.It Fl -prefix-symbols Ns = Ns Ar string 283a85fe12eSEd MastePrefix the symbol names of all the symbols with 284a85fe12eSEd Maste.Ar string . 285a85fe12eSEd Maste.It Fl -rename-section Ar oldname Ns = Ns Ar newname Ns Op Ar ,flags 286a85fe12eSEd MasteRename the section named by argument 287a85fe12eSEd Maste.Ar oldname 288a85fe12eSEd Masteto 289a85fe12eSEd Maste.Ar newname , 290a85fe12eSEd Masteoptionally changing the sections flags to that specified by argument 291a85fe12eSEd Maste.Ar flags . 292a85fe12eSEd MasteAllowed values for the argument 293a85fe12eSEd Maste.Ar flags 294a85fe12eSEd Masteare as for option 295a85fe12eSEd Maste.Fl -set-section-flags 296a85fe12eSEd Mastebelow. 297a85fe12eSEd Maste.It Fl -set-section-flags Ar sectionname Ns = Ns Ar flags 298a85fe12eSEd MasteSet the flags for the section named by argument 299a85fe12eSEd Maste.Ar sectionname 300a85fe12eSEd Masteto those specified by argument 301a85fe12eSEd Maste.Ar flags . 302a85fe12eSEd MasteArgument 303a85fe12eSEd Maste.Ar flags 304a85fe12eSEd Masteis a comma separated list of the following flag names: 305a85fe12eSEd Maste.Bl -tag -width "readonly" -compact 306a85fe12eSEd Maste.It alloc 307a85fe12eSEd MasteThe section occupies space in the output file. 308a85fe12eSEd Maste.It code 309a85fe12eSEd MasteThe section contains machine instructions. 310a85fe12eSEd Maste.It contents 311a85fe12eSEd MasteThis flag is accepted but is ignored. 312a85fe12eSEd Maste.It data 313a85fe12eSEd MasteThe section contains writeable data. 314a85fe12eSEd Maste.It debug 315a85fe12eSEd MasteThe section holds debugging information. 316a85fe12eSEd Maste.It load 317a85fe12eSEd MasteThe section is loadable. 318a85fe12eSEd Maste.It noload 319a85fe12eSEd MasteThe section should not be loaded into memory. 320a85fe12eSEd Maste.It readonly 321a85fe12eSEd MasteThe section is not writable. 322a85fe12eSEd Maste.It rom 323a85fe12eSEd MasteThe section contains ROM'able contents. 324a85fe12eSEd Maste.It share 325a85fe12eSEd MasteThis flag is accepted but is ignored. 326a85fe12eSEd Maste.El 327a85fe12eSEd Maste.It Fl -set-start Ns = Ns Ar address 328a85fe12eSEd MasteSet the start address of the output ELF object to the value specified 329a85fe12eSEd Masteby the argument 330a85fe12eSEd Maste.Ar address . 331a85fe12eSEd Maste.It Fl -srec-forceS3 332a85fe12eSEd MasteOnly generate S-records of type 333a85fe12eSEd Maste.Dq S3 . 334a85fe12eSEd MasteThis option is only meaningful when the output target is set to 335a85fe12eSEd Maste.Dq srec . 336a85fe12eSEd Maste.It Fl -srec-len Ns = Ns Ar val 337a85fe12eSEd MasteSet the maximum length of an S-record line to 338a85fe12eSEd Maste.Ar val . 339a85fe12eSEd MasteThis option is only meaningful when the output target is set to 340a85fe12eSEd Maste.Dq srec . 34167d97fe7SEd Maste.It Fl -strip-dwo 34267d97fe7SEd MasteDo not copy .dwo debug sections to the output file. 343431bcfcdSEd Maste.It Fl -strip-symbols= Ns Ar filename 344431bcfcdSEd MasteDo not copy any of the symbols specified by 345431bcfcdSEd Maste.Ar filename 346431bcfcdSEd Masteto the output. 347a85fe12eSEd Maste.It Fl -strip-unneeded 348a85fe12eSEd MasteDo not copy symbols that are not needed for relocation processing. 349a85fe12eSEd Maste.El 350a85fe12eSEd Maste.Sh DIAGNOSTICS 351a85fe12eSEd Maste.Ex -std 352a85fe12eSEd Maste.Sh SEE ALSO 353a85fe12eSEd Maste.Xr ar 1 , 354a85fe12eSEd Maste.Xr ld 1 , 355a85fe12eSEd Maste.Xr mcs 1 , 356a85fe12eSEd Maste.Xr strip 1 , 357a85fe12eSEd Maste.Xr elf 3 , 358839529caSEd Maste.Xr elftc_bfd_find_target 3 , 359a85fe12eSEd Maste.Xr ar 5 , 360a85fe12eSEd Maste.Xr elf 5 361839529caSEd Maste.Sh COMPATIBILITY 362839529caSEd MasteThe 363839529caSEd Maste.Nm 364839529caSEd Masteutility is expected to be option compatible with GNU 365839529caSEd Maste.Nm objcopy . 366a85fe12eSEd Maste.Sh HISTORY 367a85fe12eSEd Maste.Nm 368a85fe12eSEd Mastehas been implemented by 369b00fe64fSEd Maste.An Kai Wang Aq Mt kaiwang27@users.sourceforge.net . 370