Date: Sat, 6 Jul 1996 19:15:25 GMT From: James Raynard <fqueries@jraynard.demon.co.uk> To: tst@titan.cs.mci.com Cc: freebsd-questions@freebsd.org Subject: Re: How do you write to an executable (binary)? Message-ID: <199607061915.TAA02113@jraynard.demon.co.uk> In-Reply-To: <Pine.OSF.3.91.960705112043.18146B-100000@titan.cs.mci.com> (tst@titan.cs.mci.com)
next in thread | previous in thread | raw e-mail | index | archive | help
> I have a program that will prompt the user for a value. I would like to
> write that value to the executable (binary) file. (Using open, lseek,
> write, close)
Ugh. Presumably you need this for an installation program which asks
for the licence number?
> When I open the file I get the following error:
>
> "Error: Text file busy". The message number is [ETXTBSY].
>From open(2):-
The named file is opened unless:
[ETXTBSY] The file is a pure procedure (shared text) file that is be-
ing executed and the open() call requests write access.
However, it seems you *can* write to a running binary , but only if
you do it interactively:-
[a.out is a program that sleeps for 60 seconds and prints "Hello from
a.out", temp prints "Hello world!" immediately and exits]
$ ./a.out &
[1] 1952
$ cat temp > a.out
ksh: cannot create a.out: Text file busy
$ mv temp a.out
override rwxrwxr-x james/staff for a.out? y
$ ./a.out
Hello world! # The new a.out prints its message
$ Hello from a.out # 60 seconds later, the old a.out returns
> I'm able to do this with other OS. How can I get this to work with
> FreeBSD? Any ideas or suggestions would be greatly appreciated.
If you *really* have to do this, rename() can write over an executing
binary, however I would think very carefully about your program design
first...
$ cat temp.c
#include <stdio.h>
#include <unistd.h>
main() {
if (rename("a.out", "temp2") < 0)
perror("rename");
return 0;
}
$ gcc temp.c
$ ./temp2 & # The old temp2 - sleeps for 60 seconds and prints a message
$ ./a.out
$ ./temp2
rename: No such file or directory # The new temp2 can't find a.out!
$ Hello from temp2 # The old temp2 returns
--
James Raynard, Edinburgh, Scotland
james@jraynard.demon.co.uk
http://www.freebsd.org/~jraynard/
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199607061915.TAA02113>
