Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Gyan Doshi <ffmpeg@gyani.pro>
To: ffmpeg-devel@ffmpeg.org
Subject: Re: [FFmpeg-devel] [PATCH] ffbuild: read library linker objects from a file
Date: Wed, 12 Mar 2025 17:56:05 +0530
Message-ID: <ae3a7a5e-ff6b-45ba-b612-a90dd7059d44@gyani.pro> (raw)
In-Reply-To: <b2b37aa1-237d-3aa6-2ea0-453e14b7abdb@martin.st>



On 2025-03-12 05:52 pm, Martin Storsjö wrote:
> On Wed, 12 Mar 2025, Gyan Doshi wrote:
>
>> On 2025-03-12 03:12 pm, Martin Storsjö wrote:
>>> On Wed, 12 Mar 2025, Gyan Doshi wrote:
>>>
>>>> On 2025-03-12 01:29 pm, Martin Storsjö wrote:
>>>>> On Wed, 12 Mar 2025, Gyan Doshi wrote:
>>>>>
>>>>>> The linker command can exceed the maximum argument limit on MinGW,
>>>>>> especially for libavcodec.
>>>>>>
>>>>>> The objects list is now stored in a file and passed to the linker.
>>>>>> ---
>>>>>> ffbuild/library.mak | 4 +++-
>>>>>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>>>>>
>>>>>> diff --git a/ffbuild/library.mak b/ffbuild/library.mak
>>>>>> index 793e9d41fa..781b018e00 100644
>>>>>> --- a/ffbuild/library.mak
>>>>>> +++ b/ffbuild/library.mak
>>>>>> @@ -66,8 +66,10 @@ $(SUBDIR)$(SLIBNAME): 
>>>>>> $(SUBDIR)$(SLIBNAME_WITH_MAJOR)
>>>>>>
>>>>>> $(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS) $(SHLIBOBJS) $(SLIBOBJS) 
>>>>>> $(SUBDIR)lib$(NAME).ver
>>>>>>     $(SLIB_CREATE_DEF_CMD)
>>>>>> -    $$(LD) $(SHFLAGS) $(LDFLAGS) $(LDSOFLAGS) $$(LD_O) $$(filter 
>>>>>> %.o,$$^) $(FFEXTRALIBS)
>>>>>> +    $(Q)echo $$(filter %.o,$$^) > $$@.objs
>>>>>> +    $$(LD) $(SHFLAGS) $(LDFLAGS) $(LDSOFLAGS) $$(LD_O) @$$@.objs 
>>>>>> $(FFEXTRALIBS)
>>>>>>     $(SLIB_EXTRA_CMD)
>>>>>> +    -$(RM) $$@.objs
>>>>>
>>>>> Don't we need do the same for static libraries too?
>>>>>
>>>>> On first glance, this looks quite reasonable... However, the limit 
>>>>> that is an issue is the length of a command line. The .objs file 
>>>>> is written with an "echo" command - doesn't that fundamentally 
>>>>> also hit the same limit (just a little bit later, as there are 
>>>>> fewer command line flags in this command)?
>>>>>
>>>>> Or do we assume that make executes it with a shell, where the 
>>>>> shell handles "echo" as a shell builtin so that it doesn't 
>>>>> actually spawn a subprocess for this? Can you test it, if you 
>>>>> could extend the list of object files to the point where the .objs 
>>>>> file is clearly over 32 KB, and verify that it did include all the 
>>>>> files you intended?
>>>>
>>>> The specific error I got when building a shared build of 7.1.1 
>>>> (with ~90 external libs) was
>>>>
>>>> /bin/sh: line 1: /mingw64/bin/ccache: Argument list too long
>>>>
>>>> Got same error without ccache.
>>>>
>>>> The static build of the same config succeeded without any patching.
>>>> The .objs file generated for libavcodec shared build is 29KB.
>>>>
>>>> How do I inflate the size to above 32K? I've enabled pretty much 
>>>> everything I can.
>>>
>>> The simplest would probably be to add a bunch of empty .c files 
>>> (with long file names) in libavcodec and hook them up in the 
>>> makefile. We won't notice if they are missed when linking of course, 
>>> but if we pass the command line length limit, we should still notice 
>>> it in one way or another.
>>
>> I did something simpler. I just duplicated the arg on the echo line. 
>> The build was successful. Each objs file was twice as big, same for 
>> the generated DLL.
>> Does that answer your queries?
>
> Yes, thanks.
>
> Btw, just to be clear - are you running this in msys2? If you're 
> running mingw build tools via WSL, there wouldn't be any issue when 
> running the shell commands on the linux side, but it's specifically 
> with the msys2 make where it's interesting to know which limitations 
> make and the shell runs into or avoids.

Yes, via msys2.

This is what `xargs --show-limits` prints in the same shell,

POSIX upper limit on argument length (this system): 25382
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 20812
Size of command buffer we are actually using: 25382

Regards,
Gyan

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  reply	other threads:[~2025-03-12 12:26 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-12  7:42 Gyan Doshi
2025-03-12  7:59 ` Martin Storsjö
2025-03-12  8:34   ` Gyan Doshi
2025-03-12  9:42     ` Martin Storsjö
2025-03-12 10:59       ` Gyan Doshi
2025-03-12 12:22         ` Martin Storsjö
2025-03-12 12:26           ` Gyan Doshi [this message]
2025-03-12 11:24     ` Zhao Zhili

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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ae3a7a5e-ff6b-45ba-b612-a90dd7059d44@gyani.pro \
    --to=ffmpeg@gyani.pro \
    --cc=ffmpeg-devel@ffmpeg.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

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git