1.\" Copyright (c) 2007 Joseph Koshy. All rights reserved. 2.\" 3.\" Redistribution and use in source and binary forms, with or without 4.\" modification, are permitted provided that the following conditions 5.\" are met: 6.\" 1. Redistributions of source code must retain the above copyright 7.\" notice, this list of conditions and the following disclaimer. 8.\" 2. Redistributions in binary form must reproduce the above copyright 9.\" notice, this list of conditions and the following disclaimer in the 10.\" documentation and/or other materials provided with the distribution. 11.\" 12.\" This software is provided by Joseph Koshy ``as is'' and 13.\" any express or implied warranties, including, but not limited to, the 14.\" implied warranties of merchantability and fitness for a particular purpose 15.\" are disclaimed. in no event shall Joseph Koshy be liable 16.\" for any direct, indirect, incidental, special, exemplary, or consequential 17.\" damages (including, but not limited to, procurement of substitute goods 18.\" or services; loss of use, data, or profits; or business interruption) 19.\" however caused and on any theory of liability, whether in contract, strict 20.\" liability, or tort (including negligence or otherwise) arising in any way 21.\" out of the use of this software, even if advised of the possibility of 22.\" such damage. 23.\" 24.\" $FreeBSD$ 25.\" 26.Dd January 3, 2022 27.Dt AR 1 28.Os 29.Sh NAME 30.Nm ar , 31.Nm ranlib 32.Nd manage archives 33.Sh SYNOPSIS 34.Nm 35.Fl d 36.Op Fl T 37.Op Fl f 38.Op Fl j 39.Op Fl v 40.Op Fl z 41.Ar archive 42.Ar 43.Nm 44.Fl m 45.Op Fl T 46.Op Fl a Ar position-after 47.Op Fl b Ar position-before 48.Op Fl f 49.Op Fl i Ar position-before 50.Op Fl j 51.Op Fl s | Fl S 52.Op Fl z 53.Ar archive 54.Ar 55.Nm 56.Fl p 57.Op Fl T 58.Op Fl f 59.Op Fl v 60.Ar archive 61.Op Ar 62.Nm 63.Fl q 64.Op Fl T 65.Op Fl c 66.Op Fl D 67.Op Fl f 68.Op Fl s | Fl S 69.Op Fl U 70.Op Fl v 71.Op Fl z 72.Ar archive 73.Ar 74.Nm 75.Fl r 76.Op Fl T 77.Op Fl a Ar position-after 78.Op Fl b Ar position-before 79.Op Fl c 80.Op Fl D 81.Op Fl f 82.Op Fl i Ar position-before 83.Op Fl j 84.Op Fl s | Fl S 85.Op Fl u 86.Op Fl U 87.Op Fl v 88.Op Fl z 89.Ar archive 90.Ar 91.Nm 92.Fl s 93.Op Fl j 94.Op Fl z 95.Ar archive 96.Nm 97.Fl t 98.Op Fl f 99.Op Fl T 100.Op Fl v 101.Ar archive 102.Op Ar 103.Nm 104.Fl x 105.Op Fl C 106.Op Fl T 107.Op Fl f 108.Op Fl o 109.Op Fl u 110.Op Fl v 111.Ar archive 112.Op Ar 113.Nm 114.Fl M 115.Nm ranlib 116.Op Fl D 117.Op Fl U 118.Ar archive ... 119.Sh DESCRIPTION 120The 121.Nm 122utility creates and maintains groups of files combined into an 123archive. 124Once an archive has been created, new files can be added to it, and 125existing files can be extracted, deleted or replaced. 126.Pp 127Files are named in the archive by their last file name component, 128so if a file referenced by a path containing a 129.Dq / 130is archived, it will be named by the last component of the path. 131Similarly when matching paths listed on the command line against 132file names stored in the archive, only the last component of the 133path will be compared. 134.Pp 135The normal use of 136.Nm 137is for the creation and maintenance of libraries suitable for use 138with the link editor 139.Xr ld 1 , 140although it is not restricted to this purpose. 141The 142.Nm 143utility can create and manage an archive symbol table (see 144.Xr ar 5 ) 145used to speed up link editing operations. 146If a symbol table is present in an archive, it will be 147kept up-to-date by subsequent operations on the archive. 148.Pp 149The 150.Nm ranlib 151utility is used to add an archive symbol table 152to an existing archive. 153.Sh OPTIONS 154The 155.Nm 156utility supports the following options: 157.Bl -tag -width indent 158.It Fl a Ar member-after 159When used with option 160.Fl m 161this option specifies that the archive members specified by 162arguments 163.Ar 164are moved to after the archive member named by argument 165.Ar member-after . 166When used with option 167.Fl r 168this option specifies that the files specified by arguments 169.Ar 170are added after the archive member named by argument 171.Ar member-after . 172.It Fl b Ar member-before 173When used with option 174.Fl m 175this option specifies that the archive members specified by 176arguments 177.Ar 178are moved to before the archive member named by argument 179.Ar member-before . 180When used with option 181.Fl r 182this option specifies that the files specified by arguments 183.Ar 184are added before the archive member named by argument 185.Ar member-before . 186.It Fl c 187Suppress the informational message printed when a new archive is 188created using the 189.Fl r 190and 191.Fl q 192options. 193.It Fl C 194Prevent extracted files from replacing like-named files 195in the file system. 196.It Fl d 197Delete the members named by arguments 198.Ar 199from the archive specified by argument 200.Ar archive . 201The archive's symbol table, if present, is updated to reflect 202the new contents of the archive. 203.It Fl D 204When used in combination with the 205.Fl r 206or 207.Fl q 208option, 209with the 210.Fl s 211option without other options, or when invoked as 212.Nm ranlib , 213insert 0's instead of the real mtime, uid and gid values 214and 0644 instead of file mode from the members named by arguments 215.Ar . 216This ensures that checksums on the resulting archives are reproducible 217when member contents are identical. 218This option is enabled by default. 219If multiple 220.Fl D 221and 222.Fl U 223options are specified on the command line, the final one takes precedence. 224.It Fl f 225Use only the first fifteen characters of the archive member name or 226command line file name argument when naming archive members. 227.It Fl i Ar member-before 228Synonymous with option 229.Fl b . 230.It Fl j 231This option is accepted but ignored. 232.It Fl l 233This option is accepted for compatibility with GNU 234.Xr ar 1 , 235but is ignored. 236.It Fl m 237Move archive members specified by arguments 238.Ar 239within the archive. 240If a position has been specified by one of the 241.Fl a , 242.Fl b 243or 244.Fl i 245options, the members are moved to before or after the specified 246position. 247If no position has been specified, the specified members are moved 248to the end of the archive. 249If the archive has a symbol table, it is updated to reflect the 250new contents of the archive. 251.It Fl M 252Read and execute MRI librarian commands from standard input. 253The commands understood by the 254.Nm 255utility are described in the section 256.Sx "MRI Librarian Commands" . 257.It Fl o 258Preserve the original modification times of members when extracting 259them. 260.It Fl p 261Write the contents of the specified archive members named by 262arguments 263.Ar 264to standard output. 265If no members were specified, the contents of all the files in the 266archive are written in the order they appear in the archive. 267.It Fl q 268Append the files specified by arguments 269.Ar 270to the archive specified by argument 271.Ar archive 272without checking if the files already exist in the archive. 273The archive symbol table will be updated as needed. 274If the file specified by the argument 275.Ar archive 276does not already exist, a new archive will be created. 277.It Fl r 278Replace (add) the files specified by arguments 279.Ar 280in the archive specified by argument 281.Ar archive , 282creating the archive if necessary. 283Replacing existing members will not change the order of members within 284the archive. 285If a file named in arguments 286.Ar 287does not exist, existing members in the archive that match that 288name are not changed. 289New files are added to the end of the archive unless one of the 290positioning options 291.Fl a , 292.Fl b 293or 294.Fl i 295is specified. 296The archive symbol table, if it exists, is updated to reflect the 297new state of the archive. 298.It Fl s 299Add an archive symbol table (see 300.Xr ar 5 ) 301to the archive specified by argument 302.Ar archive . 303Invoking 304.Nm 305with the 306.Fl s 307option alone is equivalent to invoking 308.Nm ranlib . 309.It Fl S 310Do not generate an archive symbol table. 311.It Fl t 312List the files specified by arguments 313.Ar 314in the order in which they appear in the archive, one per line. 315If no files are specified, all files in the archive are listed. 316.It Fl T 317This option is accepted but ignored. 318In other implementations of 319.Nm , 320.Fl T 321creates a "thin" archive. 322.It Fl u 323Conditionally update the archive or extract members. 324When used with the 325.Fl r 326option, files named by arguments 327.Ar 328will be replaced in the archive if they are newer than their 329archived versions. 330When used with the 331.Fl x 332option, the members specified by arguments 333.Ar 334will be extracted only if they are newer than the corresponding 335files in the file system. 336.It Fl U 337When used in combination with the 338.Fl r 339or 340.Fl q 341option, insert the real mtime, uid and gid, and file mode values 342from the members named by arguments 343.Ar . 344If multiple 345.Fl D 346and 347.Fl U 348options are specified on the command line, the final one takes precedence. 349.It Fl v 350Provide verbose output. 351When used with the 352.Fl d , 353.Fl m , 354.Fl q 355or 356.Fl x 357options, 358.Nm 359gives a file-by-file description of the archive modification being 360performed, which consists of three white-space separated fields: 361the option letter, a dash 362.Dq "-" , 363and the file name. 364When used with the 365.Fl r 366option, 367.Nm 368displays the description as above, but the initial letter is an 369.Dq a 370if the file is added to the archive, or an 371.Dq r 372if the file replaces a file already in the archive. 373When used with the 374.Fl p 375option, the name of the file enclosed in 376.Dq < 377and 378.Dq > 379characters is written to standard output preceded by a single newline 380character and followed by two newline characters. 381The contents of the named file follow the file name. 382When used with the 383.Fl t 384option, 385.Nm 386displays eight whitespace separated fields: 387the file permissions as displayed by 388.Xr strmode 3 , 389decimal user and group IDs separated by a slash ( 390.Dq / Ns ) , 391the file size in bytes, the file modification time in 392.Xr strftime 3 393format 394.Dq "%b %e %H:%M %Y" , 395and the name of the file. 396.It Fl V 397Print a version string and exit. 398.It Fl x 399Extract archive members specified by arguments 400.Ar 401into the current directory. 402If no members have been specified, extract all members of the archive. 403If the file corresponding to an extracted member does not exist it 404will be created. 405If the file corresponding to an extracted member does exist, its owner 406and group will not be changed while its contents will be overwritten 407and its permissions will set to that entered in the archive. 408The file's access and modification time would be that of the time 409of extraction unless the 410.Fl o 411option was specified. 412.It Fl z 413This option is accepted but ignored. 414.El 415.Ss "MRI Librarian Commands" 416If the 417.Fl M 418option is specified, the 419.Nm 420utility will read and execute commands from its standard input. 421If standard input is a terminal, the 422.Nm 423utility will display the prompt 424.Dq Li "AR >" 425before reading a line, and will continue operation even if errors are 426encountered. 427If standard input is not a terminal, the 428.Nm 429utility will not display a prompt and will terminate execution on 430encountering an error. 431.Pp 432Each input line contains a single command. 433Words in an input line are separated by whitespace characters. 434The first word of the line is the command, the remaining words are 435the arguments to the command. 436The command word may be specified in either case. 437Arguments may be separated by commas or blanks. 438.Pp 439Empty lines are allowed and are ignored. 440Long lines are continued by ending them with the 441.Dq Li + 442character. 443.Pp 444The 445.Dq Li * 446and 447.Dq Li "\&;" 448characters start a comment. 449Comments extend till the end of the line. 450.Pp 451When executing an MRI librarian script the 452.Nm 453utility works on a temporary copy of an archive. 454Changes to the copy are made permanent using the 455.Ic save 456command. 457.Pp 458Commands understood by the 459.Nm 460utility are: 461.Bl -tag -width indent 462.It Ic addlib Ar archive | Ic addlib Ar archive Pq Ar member Oo Li , Ar member Oc Ns ... 463Add the contents of the archive named by argument 464.Ar archive 465to the current archive. 466If specific members are named using the arguments 467.Ar member , 468then those members are added to the current archive. 469If no members are specified, the entire contents of the archive 470are added to the current archive. 471.It Ic addmod Ar member Oo Li , Ar member Oc Ns ... 472Add the files named by arguments 473.Ar member 474to the current archive. 475.It Ic clear 476Discard all the contents of the current archive. 477.It Ic create Ar archive 478Create a new archive named by the argument 479.Ar archive , 480and makes it the current archive. 481If the named archive already exists, it will be overwritten 482when the 483.Ic save 484command is issued. 485.It Ic delete Ar module Oo Li , Ar member Oc Ns ... 486Delete the modules named by the arguments 487.Ar member 488from the current archive. 489.It Ic directory Ar archive Po Ar member Oo Li , Ar member Oc Ns ... Pc Op Ar outputfile 490List each named module in the archive. 491The format of the output depends on the verbosity setting set using 492the 493.Ic verbose 494command. 495Output is sent to standard output, or to the file specified by 496argument 497.Ar outputfile . 498.It Ic end 499Exit successfully from the 500.Nm 501utility. 502Any unsaved changes to the current archive will be discarded. 503.It Ic extract Ar member Oo Li , Ar member Oc Ns ... 504Extract the members named by the arguments 505.Ar member 506from the current archive. 507.It Ic list 508Display the contents of the current archive in verbose style. 509.It Ic open Ar archive 510Open the archive named by argument 511.Ar archive 512and make it the current archive. 513.It Ic replace Ar member Oo Li , Ar member Oc Ns ... 514Replace named members in the current archive with the files specified 515by arguments 516.Ar member . 517The files must be present in the current directory and the named 518modules must already exist in the current archive. 519.It Ic save 520Commit all changes to the current archive. 521.It Ic verbose 522Toggle the verbosity of the 523.Ic directory 524command. 525.El 526.Sh EXAMPLES 527To create a new archive 528.Pa ex.a 529containing three files 530.Pa ex1.o , 531.Pa ex2.o 532and 533.Pa ex3.o , 534use: 535.Dl "ar -rc ex.a ex1.o ex2.o ex3.o" 536.Pp 537To add an archive symbol table to an existing archive 538.Pa ex.a , 539use: 540.Dl "ar -s ex.a" 541.Pp 542To delete file 543.Pa ex1.o 544from archive 545.Pa ex.a , 546use: 547.D1 "ar -d ex.a ex1.o" 548.Pp 549To verbosely list the contents of archive 550.Pa ex.a , 551use: 552.D1 "ar -tv ex.a" 553.Pp 554To create a new archive 555.Pa ex.a 556containing the files 557.Pa ex1.o , 558and 559.Pa ex2.o , 560using MRI librarian commands, use the following script: 561.Bd -literal -offset indent 562create ex.a * specify the output archive 563addmod ex1.o ex2.o * add modules 564save * save pending changes 565end * exit the utility 566.Ed 567.Sh DIAGNOSTICS 568.Ex -std 569.Sh SEE ALSO 570.Xr ld 1 , 571.Xr archive 3 , 572.Xr elf 3 , 573.Xr strftime 3 , 574.Xr strmode 3 , 575.Xr ar 5 576.Sh STANDARDS COMPLIANCE 577The 578.Nm 579utility's support for the 580.Fl a , 581.Fl b , 582.Fl c , 583.Fl i , 584.Fl m , 585.Fl p , 586.Fl q , 587.Fl r , 588.Fl s , 589.Fl t , 590.Fl u , 591.Fl v , 592.Fl C 593and 594.Fl T 595options is believed to be compliant with 596.St -p1003.2 . 597.Sh HISTORY 598An 599.Nm 600command first appeared in AT&T UNIX Version 1. 601In 602.Fx 8.0 , 603.An Kai Wang Aq Mt kaiw@FreeBSD.org 604reimplemented 605.Nm 606and 607.Nm ranlib 608using the 609.Lb libarchive 610and the 611.Lb libelf . 612