From: Ken Brown <kbrown@cornell.edu>
To: Eli Zaretskii <eliz@gnu.org>
Cc: Stromeko@nexgo.de, 50666@debbugs.gnu.org, akrl@sdf.org
Subject: bug#50666: 28.0.50; Fix native compilation on Cygwin
Date: Thu, 23 Sep 2021 13:13:05 -0400 [thread overview]
Message-ID: <a4c6b589-dc73-9553-a7a3-271f4aca0aaa@cornell.edu> (raw)
In-Reply-To: <83bl4juu2c.fsf@gnu.org>
On 9/23/2021 12:37 PM, Eli Zaretskii wrote:
>> Cc: Stromeko@nexgo.de, 50666@debbugs.gnu.org
>> From: Ken Brown <kbrown@cornell.edu>
>> Date: Thu, 23 Sep 2021 10:20:19 -0400
>>
>>> Is it really necessary to rebase the *.eln files before each startup?
>>> Isn't it enough to rebase each of the .eln files just once, when it is
>>> produced? If indeed this is needed every time, can you explain why?
>>
>> We have to distinguish between system libraries and user libraries. Libraries
>> installed by Cygwin packages are system libraries. The *.eln files in
>> ~/.emacs.d/eln-cache are user libraries. Cygwin maintains a database of all
>> system libraries and their base addresses. Whenever a Cygwin package is
>> installed or updated, Cygwin rebases all system libraries and updates the database.
>>
>> Each time Emacs starts, it has no way of knowing whether the system libraries
>> have been rebased since the last time Emacs was run. So the user's *.eln files
>> could now have base address conflicts with system libraries. Rebasing the *.eln
>> files fixes this problem.
>
> What do you mean by "system libraries" here? Does it, for example,
> include the DLLs distributed in the Cygwin port of libpng or libjpeg?
Yes.
> Or does that include only the basic libraries: the Cygwin DLL, the C
> runtime, etc.? >
>>> The non-preloaded *.eln files are all loaded by native-elisp-load, so
>>> I guess the rebase should be launched from there? The preloaded *.eln
>>> files are loaded in pdumper.c:dump_do_dump_relocation, but do we need
>>> to support non-rebased preloaded *.eln files?
>>
>> The preloaded *.eln files will be installed by Cygwin's package manager when
>> emacs is installed. They are therefore system libraries and are automatically
>> rebased as needed.
>
> If the only problem is with non-preloaded *.eln files, why not rebase
> them on the fly, when they are loaded. That is, run the 'rebase'
> command from the native-elisp-load function, before it actually loads
> the file. User libraries are never loaded during startup, only when
> some Lisp requires them.
Good idea.
>>> When an updated .eln file is produced for .eln that is loaded into
>>> some running Emacs, Emacs on Windows renames the original .eln to
>>> avoid a similar problem.
>>
>> I hadn't thought of this issue. We may have to use a similar technique...
>>
>>> Can't you use the same technique, to avoid
>>> the need of rebasing on each start?
>>
>> ...but it wouldn't eliminate the need for rebasing at each start for the reasons
>> explained above.
>
> Perhaps that need could be eliminated after all, see above.
>
>>> Please note that users could
>>> place *.eln files in unusual locations (and customize
>>> native-comp-eln-load-path to reflect that), so finding _all_ of the
>>> relevant *.eln files from a shell script might not be easy. In fact,
>>> even without customizing the load-path, I don't think I understand how
>>> will that script you propose know where to find all the *.eln files.
>>
>> The current proposal that Achim and I are looking at would require each user to
>> maintain a file ~/.config/rebase/dynpath.d/emacs containing a list of
>> directories where the .eln files can be found. By default, this file would
>> contain one line, which is the path to the standard eln-cache directory. Users
>> who customize native-comp-eln-load-path would have to modify that file accordingly.
>
> That's tough on users, because Emacs by default automatically compiles
> every .el file it loads into .eln, if there's no up-to-date .eln file
> already, and the compilation runs in the background (by forking
> additional Emacs sub-processes that run in batch mode). In addition,
> the native-compilation process sometimes decides that it needs to
> create a special "trampoline" .eln file (if you want to know why, I'm
> sure Andrea can explain) that correspond to parts of the *.el files.
> The upshot is that users may not even be aware that new *.eln files
> have been created as part of their session, and may not know their
> names. Unless the automatic rebase process, which runs from
> native-elisp-load, will also update the file in dynpath.d, I don't see
> how users could maintain such a database by hand in practice.
>
> There's one more aspect that you should be aware of. A single file
> FOO.el could give birth to several different .eln files, for example
> if they are compiled by different Emacs binaries and/or from different
> source directories and/or from somewhat different versions of FOO.el.
> For example, I now have 3 different versions of .eln files
> corresponding to window.el, in the same directory:
>
> window-0d1b8b93-3370bedb.eln
> window-0d1b8b93-7d08b7b4.eln
> window-0d1b8b93-f8fc9683.eln
>
> This makes the job of maintaining the database by hand even harder and
> more error-prone.
>
>> Finally, as a side note, I don't think it would be a tragedy if this just turns
>> out to be too complicated and we have to disable native compilation on 32-bit
>> Cygwin. The Cygwin home page at https://cygwin.com/ already contains the following:
>>
>> Address space is a very limiting factor for Cygwin. These days, a full
>> 32 bit Cygwin distro is not feasible anymore, and will in all likelihood
>> fail in random places due to an issue with the fork(2) system call.
>>
>> Therefore we recommend using 32 bit Cygwin only in limited scenarios, with
>> only a minimum of necessary packages installed, and only if there's no way
>> to run 64 bit Cygwin instead.
>
> My point is that maybe we should make that decision already, before
> burning too much time and energy on it.
You might be right. I wasn't aware of all the complications you mentioned above.
We still need to do something for 64-bit Cygwin. Even though address collisions
are unlikely they could still happen theoretically. But there might be a much
easier solution that doesn't necessarily require rebasing. For example, Achim
mentioned earlier the possibility of marking the eln as ASLR w/ high-entropy and
large address aware.
> Maybe you should ask on the
> Cygwin list whether somebody will object to making 32-bit Cygwin Emacs
> a second-class citizen.
Well, 32-bit Cygwin is already a second-class citizen, so we might just have to
do that whether someone objects or not. But I'll continue the discussion with
Achim on the cygwin-apps list before making a final decision.
Thanks for all your comments and suggestions.
Ken
next prev parent reply other threads:[~2021-09-23 17:13 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-18 20:46 bug#50666: 28.0.50; Fix native compilation on Cygwin Ken Brown
2021-09-18 20:58 ` Ken Brown
2021-09-19 5:37 ` Eli Zaretskii
2021-09-19 7:00 ` ASSI
2021-09-19 7:08 ` Eli Zaretskii
2021-09-19 11:31 ` ASSI
2021-09-19 12:06 ` Eli Zaretskii
2021-09-19 12:37 ` Ken Brown
2021-09-19 13:41 ` Eli Zaretskii
2021-09-19 14:27 ` Ken Brown
2021-09-19 15:28 ` Eli Zaretskii
2021-09-19 16:17 ` Ken Brown
2021-09-19 17:12 ` Eli Zaretskii
2021-09-22 21:35 ` Ken Brown
2021-09-23 7:42 ` Eli Zaretskii
2021-09-23 14:20 ` Ken Brown
2021-09-23 16:37 ` Eli Zaretskii
2021-09-23 17:13 ` Ken Brown [this message]
2021-09-23 17:29 ` Eli Zaretskii
2021-09-23 17:49 ` Achim Gratz
2021-09-23 18:01 ` Eli Zaretskii
2021-09-23 18:25 ` Achim Gratz
2021-09-23 18:46 ` Eli Zaretskii
2021-10-28 22:22 ` Ken Brown
2021-10-29 5:54 ` Eli Zaretskii
2021-10-29 17:03 ` Ken Brown
2021-10-29 18:01 ` Eli Zaretskii
2021-10-29 18:12 ` Ken Brown
2021-10-31 20:22 ` Achim Gratz
2021-10-31 23:52 ` Ken Brown
2021-09-23 17:27 ` Achim Gratz
2021-09-23 17:48 ` Eli Zaretskii
2021-09-23 18:29 ` Achim Gratz
2021-09-23 18:57 ` Eli Zaretskii
2021-09-23 19:37 ` Andrea Corallo via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-09-24 6:11 ` ASSI
2021-09-24 7:13 ` Eli Zaretskii
2021-09-24 7:32 ` Andrea Corallo via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-09-24 9:05 ` ASSI
2021-09-24 10:48 ` Eli Zaretskii
2021-09-25 15:10 ` Eli Zaretskii
2021-09-23 19:11 ` Andrea Corallo via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-09-23 19:21 ` Eli Zaretskii
2021-09-24 6:04 ` ASSI
2021-09-24 7:10 ` Eli Zaretskii
2021-09-24 7:26 ` Andrea Corallo via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-09-24 11:10 ` Eli Zaretskii
2021-09-24 12:49 ` Andrea Corallo via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-09-24 9:15 ` ASSI
2021-09-24 11:03 ` Eli Zaretskii
2021-09-19 5:32 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a4c6b589-dc73-9553-a7a3-271f4aca0aaa@cornell.edu \
--to=kbrown@cornell.edu \
--cc=50666@debbugs.gnu.org \
--cc=Stromeko@nexgo.de \
--cc=akrl@sdf.org \
--cc=eliz@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).