9 ms·
x86: Deprecate a.out support
- jepler 8y agoI thought we didn't break userspace
- Arnt 8y agoSure. But is there an a.out userspace? How do you make a.out binaries on linux today?
- ktjfi 8y agoIsn't a.out the default output format of gcc? I think if you type "gcc myfile.c" you get an a.out executable.
- FineTralfazz 8y agoIt's named a.out, but that's just a legacy convention. It's still an ELF file.
- classichasclass 8y agoNo, you get a file named a.out by default, but it's not in that format.
- tannhaeuser 8y agoNo it's just the file name. If you run `file` on it, it'll tell you it's an ELF image.
- torlakur 8y agoThe name has stuck for some reason, but actually the output format is ELF.
- moray 8y agoHere it refers to the binary executable file format not the default file name gcc uses after compilation. a.out is a very old format superseded by ELF. https://en.wikipedia.org/wiki/A.out https://en.wikipedia.org/wiki/A.out
- benj111 8y agoAs others have pointed out it's an elf file called a.out. I would like to ask who's idea it was to name GCCs default output after a completely different file format ?!
- naniwaduni 8y agoThe format was named for the file, not the file for the format. By the time this became incongruous, it was too late to fix.
- Arnt 8y agogcc copied most of its command-line arguments from older compilers, including -o, and the default value if -o isn't set was also copied. So the command-line arguments and defaults are older than the ELF format. When ELF support was added, the question was: Should the default value for -o depend on other arguments? There didn't seem to be good reason to have a complicated default, and keeping the simple default provided compatibility with old scripts and makefiles. cd tests ; for a in *.c ; do gcc $a && ./a.out ; done
- Someone 8y ago“Don’t break userspace” also means that I should be able to run a binary that I recover from a tape backup made in 1992.
- Arnt 8y agoI assume that binary used shared libraries? I still have the file system from a linux host I installed in 1999 or 2000. Debian; I made a VM copy when I retired the iron. It doesn't have a.out shared libraries, so even if the kernel's support worked in 2000, I could't run that binary for lack of shared libraries. If the kernel's support hasn't really been tested for 19-20 years and the shared libraries haven't even been built, then I think running that binary has very poor chances of working.
- ktm5j 8y agoI'm not trying to weigh in on the debate here, but it's perfectly reasonable to imagine having a statically linked binary that you wanted to run..
- Arnt 8y agoAbsolutely. Now, if you agree that shared libraries haven't been available for a long time and that coredumps haven't worked for a long time, that doesn't mean that nothing works. That doesn't mean that every case has been broken. But I think it means that the support has been very lightly tested for a long time now, or not tested at all. And assuming that something works when it hasn't been tested for a long time is ugh. I think the reason I care about this is dogmatic. I believe, dogmatically, that untested code is broken. If you accept that dogma and do not test a.out support now, then the coming change does not break a.out. If you do test, fine. If you disagree that untested code is broken, fine. If you say it "might imaginably work" or somesuch, fine.
- 0815test 8y agoThey could reimplement it using the kernel's general binfmt support. It's really just getting rid of some legacy code.
- reacweb 8y agoWe are speaking of userspace generated between 1992 and 1995. At that time, linux was installed from floppy disks. Do you think there is someone who still has a floppy drive, who needs recent versions of linux and who has so old programms still working ?
- jerf 8y agoLinus has a policy: Don't break userspace. See https://felipec.wordpress.com/2013/10/07/the-linux-way/ https://felipec.wordpress.com/2013/10/07/the-linux-way/ That's a great blog post; it's not just about the policy, but talks about some people who disagree, provides a lot of links, and is just generally better than anything I could hope to write here. I'll only observe that I'm not endorsing anything except that that's a pretty good post. I'm just pointing out the context, not arguing for or against "don't break userspace" personally.
- coldtea 8y ago>Linus has a policy: Don't break userspace He's also pragmatic. He will break userspace in 100 ways if it's needed.
- zaarn 8y agoLinus has somewhat recently clarified that position regarding old stuff; they break userspace if the break has happened years ago and nobody said anything in the meantime about it. If you notice upgrading from 2.5 to 4.20 breaks your app, nobody at the LKML or any subsystem maintainer is likely to fix it. A.out is so positively ancient that it's likely been broken for years, nobody is testing or using it in live systems anymore.
- boomlinde 8y agoWhat userspace applications will it break? I suppose that there may be some setups using a.out yet, but I have a hard time imagining that operators of such systems are holding their breath for the next version of the kernel.
- zaarn 8y agoLinux does break userspace. It's inevitable. But everyone takes care it doesn't happen and if you report the regression immediately it will be fixed. But if it's broken for 3 years and you didn't say anything, nobody will make a fix for it. Or it's unlikely. A.out isn't used anymore. Like, not even the most ancient linux machines are likely to use a.out format. It's atm going to be hidden behind a flag, default off, if nobody complains then it'll be completely removed in a few releases.
- ldng 8y agoWell they are not. Yet. It is a deprecation notice and at some point they will break userspace. You're quote is a matter of context. When Linus say never break userspace, I understand it as : never break userspace without warning and consensus over an alternative. Don't break the userspace to force it to evolve or fix things. Fix it there first and then deprecate. It is not the same thing.
- icedchai 8y agoI remember upgrading my Slackware box from a.out to ELF back in 1995 or so.
- ordu 8y agoWhat did it meant? I'm just curious, was it the issue of dynamic library format, or need to change ld.so, or what?
- icedchai 8y agoIt's been 20+ years, so I'm a bit fuzzy on the details. I do recall having to at least build a new kernel with ELF support, then a compile a new libc and ld.so. My system had a mix of both a.out and ELF binaries for a while. This was a "heavily customized" Slackware, circa 1994, where I installed the base system then upgraded things from source...
- emj 8y agoTotal replacement of all compiled binaries AFAIR, and then you failed the upgrade in some way e.g. failing to upgrade libc resulting in a completely broken system. I remember I had 100MB of HD to do this upgrade so it was tight.
- avian 8y agoI’ve been using Linux since Debian Slink (1999). I’ve never seen an a.out binary in the wild (although I seem to remember that various HOWTOs commonly mentioned them at the time).
- pjmlp 8y agoYep, that was my very first Linux distribution, Slackware 2.0 with kernel 1.0.9.
- kgwgk 8y agoSo many floppies... The following disk sets are available: A The base system. Enough to get up and running and have elvis and comm programs available. Based around the 1.0.9 Linux kernel, and the new filesystem standard (FSSTND). These disks are known to fit on 1.2M disks, although the rest of Slackware won't. If you have only a 1.2M floppy, you can still install the base system, download other disks you want and install them from your hard drive. AP Various applications and add ons, such as the manual pages, groff, ispell (GNU and international versions), term, joe, jove, ghostscript, sc, bc, and the quota patches. D Program development. GCC/G++/Objective C 2.5.8, make (GNU and BSD), byacc and GNU bison, flex, the 4.5.26 C libraries, gdb, kernel source for 1.0.9, SVGAlib, ncurses, clisp, f2c, p2c, m4, perl, rcs. E GNU Emacs 19.25. F A collection of FAQs and other documentation. I Info pages for GNU software. Documentation for various programs readable by info or Emacs. N Networking. TCP/IP, UUCP, mailx, dip, deliver, elm, pine, smail, cnews, nn, tin, trn. OOP Object Oriented Programming. GNU Smalltalk 1.1.1, and the Smalltalk Interface to X (STIX). Q Alpha kernel source and images (currently contains Linux 1.1.18). TCL Tcl, Tk, TclX, blt, itcl. Y Games. The BSD games collection, and Tetris for terminals. X The base XFree86 2.1.1 system, with libXpm, fvwm 1.20, and xlock added. XAP X applications: X11 ghostscript, libgr13, seyon, workman, xfilemanager, xv 3.01, GNU chess and xboard, xfm 1.2, ghostview, and various X games. XD X11 program development. X11 libraries, server linkkit, PEX support. XV Xview 3.2 release 5. XView libraries, and the Open Look virtual and non-virtual window managers. IV Interviews libraries, include files, and the doc and idraw apps. These run unreasonably slow on my machine, but they might still be worth looking at. OI ParcPlace's Object Builder 2.0 and Object Interface Library 4.0, generously made available for Linux developers according to the terms in the "copying" notice found in these directories. Note that these only work with libc-4.4.4, but a new version may be released once gcc 2.5.9 is available. T The TeX and LaTeX2e text formatting systems.
- girst 8y agothe thread about this in the kernel mailing list: https://lore.kernel.org/lkml/20190305145717.GD8256@zn.tnic/ https://lore.kernel.org/lkml/20190305145717.GD8256@zn.tnic/
- avian 8y agoInteresting bit from Wikipedia: “Linux's transition to ELF was more or less forced due to the complex nature of building a.out shared libraries on that platform, which included the need to register the virtual address space at which the library was located with a central authority, as the a.out ld.so in Linux was unable to relocate shared libraries.” https://en.wikipedia.org/wiki/A.out https://en.wikipedia.org/wiki/A.out
- TorKlingberg 8y agoI don't think I have ever encountered an a.out binary in many years of using Linux. The default compiler output file is named a.out, but it's actually in ELF format. I have encountered COFF executables, and been part of a COFF->ELF transition on a embedded system, but Linux never supported COFF afaik.
- pkaye 8y agoIn the earlier days the executables were all a.out format. There was a transition year where all the ELF binaries were slowly being converted over to ELF format in the Linux distributions. There was a similar transition when unicode became standard.
- qubex 8y agoI remember that. I was running Slackware at the time and I had an eventful couple of months...
- ihuman 8y agoIs this related to the a.out file that gcc outputs if you don't specify a filename with -o? Also, I thought bit rot was bits in files changing over time due to the storage medium failing; is this a different use of the term?
- enriquto 8y ago> Is this related to the a.out file that gcc outputs if you don't specify a filename with -o? Yes, it is historically related. The file format is the descendant of binary format of the first C compiler, that already produced a.out files by default. Today in linux you typically get an ELF, but is still called like that.
- schoen 8y agoSee downthread: https://news.ycombinator.com/item?id=19338196 https://news.ycombinator.com/item?id=19338196 (answer: historically related, but the gcc output isn't in this format today)
- pwg 8y ago> Is this related to the a.out file that gcc outputs if you don't specify a filename with -o? It is not directly related to the filename used by gcc. It is related to the a.out binary executable file format (https://en.wikipedia.org/wiki/A.out https://en.wikipedia.org/wiki/A.out). It is confusing due to the file format, and the choice of default name by gcc, having the same name. > Also, I thought bitrot was bits in files changing over time due to the storage medium failing; That is the usual meaning for "bitrot". > is this a different use of the term? To some extent yes. In this context the use of "bitrot" is related to parts of the source code drifting apart from changes made in other areas of the source. So in a very broad sense, a similar meaning, but also a very contextual based meaning.
- schoen 8y agoSee http://www.jargon.net/jargonfile/s/softwarerot.html http://www.jargon.net/jargonfile/s/softwarerot.html ("maybe be semi-humorously ascribed to bit rot")
- 8y ago
- NelsonMinar 8y agoI still have some ancient statically linked a.out Linux binaries lying around from my old projects where the compile environment was sufficiently complicated I don't think I could easily recompile the code. I appreciate that I can still run the binaries. But I think the last time I actually needed to was ~8 years ago.
- groestl 8y agoI'm sure there will be an emulator for those, the next time you need it!
- TazeTSchnitzel 8y agoI wonder if such files could be converted to elf.
- grawprog 8y agoSeems like it should be possible. https://stackoverflow.com/questions/15291168/how-to-convert-linux-kernel-bin-into-elf-format https://stackoverflow.com/questions/15291168/how-to-convert-... You can do it the other way around. https://www.systutorials.com/docs/linux/man/1-elftoaout/ https://www.systutorials.com/docs/linux/man/1-elftoaout/
- gus_massa 8y agoFrom Linus himself: https://lore.kernel.org/lkml/CAHk-=wi2E4kugAW7BQwNSVwYHOr=B_9EgzBRMpQ2+1dxAqydDg@mail.gmail.com/ https://lore.kernel.org/lkml/CAHk-=wi2E4kugAW7BQwNSVwYHOr=B_... > Because I think the likeliihood that anybody cares about a.out core dumps is basically zero. While the likelihood that we have some odd old binary that is still a.out is slightly above zero.
- tomc1985 8y agoMan, my very first C program was a file called a.out RIP :/
- oflebbe 8y agoWow this is 25 years ago? I can vaguely remember when Eric Youngdale approached libc's HJ Lu to fix shared libs by not reinventing the wheel but using Sys V ELF. Great article by Eric back than https://www.linuxjournal.com/article/1060 https://www.linuxjournal.com/article/1060 .
- gumby 8y agoTo fix the nomenclature confusion in this thread: a.out was the name of the output file from unix linker. Thus the format of that file was "a.out" format. all the other unix toolchains did the same thing for compatibility. a.out is pretty limited, though fine for small PDP-11 binaries: some text (executable), initialized data, and an amount of RAM to preallocate, plus some symbols. Even when I was designing bfd back in 1989 it was clear that a.out, while pervasive, just wasn't powerful enough, especially when you added C++ constructors, destructors, atexit stuff etc. SVR4 by then had COFF to be more flexible (Microsoft's PE is a COFF derivative). But COFF was kinda crufty (not bad for a first effort!) and was clumsy for things like shared libraries. ELF is a good example of a standards committee designing something to handle known problems. It's not perfect, but pretty good.
- egorfine 8y agoI'm curious to learn: what C++ constructors have to do with the executable format? I do get that atexit might require a special place in the binary for the kernel to jump to, but how does a relatively high end language feature drop down to binary format?
- pjmlp 8y agoConstructors of global static objects, they are required to be called before main() starts execution, likewise destructors of such objects are supposed to run in inverse order on program termination, including after call to atexit(). This needs to happen regardless how the binary, or dynamic library gets loaded.
- gumby 8y ago> how does a relatively high end language feature drop down to binary format? All high end language features drop down to binary formats -- that's what ABIs are. In the case of things like constructors and destructors you can of course just stick them all in the text section and have the linker construct call to them in some fashion. You'd have to use some reserved name mangling to distinguish them so that the linker can even find them. If instead you have separate sections the linker can just run through the symbol table; the dynamic loader can even do so so the compile-time linker can ignore those sections (just copy them). You can even play tricks like unloading them after running (or only load exit code upon exit) if memory games like that matter. etc etc. It's all about how you communicate semantic issues from compile time to run time, as with all ABI issues.
- cracauer 8y agoAt the time I wasn't happy with that change. All of the BSD's did shared libraries with a.out just fine. The BSDs used GNU binutils, so the improvements were there to use for Linux. Linux' change away from a.out meant that binutils stopped developing a.out support, which then forced an ELF change on the BSDs. At the time I could run an entire firewall on a 1.44 MB floppy, kernel, libs and enough userland for ipfw scripting. With FreeBSD 2.x. FreeBSD 3.x with ELF put that right out of reach. Of course now that I spend my days parking silly stuff in random ELF sections I am pretty happy.