[physfs] Getting every instance of overlapping files

Tim Čas darkuranium at gmail.com
Wed Aug 27 10:29:53 EDT 2014


Which version of PhysFS is that based on? (so that I can download the
other files)

Also, you mentioned that it doesn't find the symbol in the DLL ---
where are you putting said DLL? Is it in the same directory as the
program? (it might be finding a different, older DLL)

On 27 August 2014 16:10, Haydn Harach <hharach at gmail.com> wrote:
> I tried using "-static -lphysfs -dynamic" instead of "-lphysfs", but now it
> breaks everything else (namely, SDL).
>
> Here's a link to the files I've modified: physfs.h, physfs.c, libphysfs.a,
> libphysfs.dll, and libphysfs.dll.a:
> https://www.dropbox.com/s/4jjxhxodoxvlbr9/physfs%20modifications.zip?dl=0
>
>
> On Wed, Aug 27, 2014 at 8:01 AM, Tim Čas <darkuranium at gmail.com> wrote:
>>
>> Yes, linking with that will link with the DLL. Try adding '-static' before
>> '-lphysfs' and '-dynamic' after to link with the static lib.
>>
>> Can you upload the DLL and/or the sources somewhere so that I can take a
>> look with 'nm' and try compiling myself?
>>
>> On Aug 27, 2014 3:51 PM, "Haydn Harach" <hharach at gmail.com> wrote:
>>>
>>> I'm just linking with -lphysfs, like you said.  I don't have MSYS.  The
>>> only source file I modified was physfs.c, I didn't add any.
>>>
>>>
>>> On Wed, Aug 27, 2014 at 7:45 AM, Tim Čas <darkuranium at gmail.com> wrote:
>>>>
>>>> How are you using libphysfs.a? I've often found that linking with just
>>>> -lphysfs tends to make MinGW link with the DLL instead of the library.
>>>>
>>>> If you have MSYS, you can also try this to find out if the DLL exports
>>>> the symbol (which would indicate that the problem is elsewhere):
>>>> $ nm libphysfs.dll | grep openRead
>>>>
>>>> Oh and, I just had a thought --- when you added PHYSFS_openReadMulti,
>>>> did you create any new source files? If you did, you have to run cmake
>>>> again for it to recognize the new files? It is entirely possible that
>>>> it's not compiling in said new file (though that wouldn't quite
>>>> explain why the symbol exists in the static library).
>>>>
>>>> On 27 August 2014 15:21, Haydn Harach <hharach at gmail.com> wrote:
>>>> > It creates "libphysfs.a", "libphysfs.dll", and "libphysfs.dll.a"
>>>> >
>>>> > I've tried using both the .dll and the non-.dll version of the .a
>>>> > library,
>>>> > they both have the issues.  Interestingly, when using libphysfs.a, it
>>>> > still
>>>> > requires libphysfs.dll, even before I started modifying the source
>>>> > code.
>>>> >
>>>> >
>>>> > On Wed, Aug 27, 2014 at 7:17 AM, Tim Čas <darkuranium at gmail.com>
>>>> > wrote:
>>>> >>
>>>> >> And did you also compile the DLLs, or did you only compile the static
>>>> >> (*.a) library? MinGW tends to create one file for static builds
>>>> >> (foo.a
>>>> >> or libfoo.a) and two files for dynamic builds ({lib,}foo.dll.a and
>>>> >> {lib,}foo.dll) --- it seems that you've perhaps only created the
>>>> >> static library?
>>>> >>
>>>> >> On 27 August 2014 13:05, Haydn Harach <hharach at gmail.com> wrote:
>>>> >> > Yes, I did replace the dll's.  From what I gather,
>>>> >> > `PHYSFS_openReadMulti` is
>>>> >> > present in `physfs.a` but not in `physfs.dll`, and
>>>> >> > `PHYSFS_closeList` is
>>>> >> > not
>>>> >> > present in `physfs.a` (and presumably not in `physfs.dll`, either).
>>>> >> >
>>>> >> > I'm compiling both physfs and my app using MinGW-W64.
>>>> >> >
>>>> >> >
>>>> >> > On Wed, Aug 27, 2014 at 3:39 AM, Tim Čas <darkuranium at gmail.com>
>>>> >> > wrote:
>>>> >> >>
>>>> >> >> Did you replace the DLLs after compiling? The application might
>>>> >> >> still
>>>> >> >> be
>>>> >> >> using the old one if you forgot to do that.
>>>> >> >>
>>>> >> >>
>>>> >> >> On 27 August 2014 10:10, Haydn Harach <hharach at gmail.com> wrote:
>>>> >> >>>
>>>> >> >>> PHYSFS_openReadMulti compiles just fine, but then my app crashes
>>>> >> >>> because
>>>> >> >>> it can't find it in physfs.dll.  So, it found it in the .a, but
>>>> >> >>> not in
>>>> >> >>> the
>>>> >> >>> .dll?  what am I doing wrong compiling physfs? >.<
>>>> >> >>>
>>>> >> >>>
>>>> >> >>> On Tue, Aug 26, 2014 at 9:51 AM, Haydn Harach <hharach at gmail.com>
>>>> >> >>> wrote:
>>>> >> >>>>
>>>> >> >>>> Now I'm having trouble rebuilding the project.  I'm trying to
>>>> >> >>>> use a
>>>> >> >>>> code::blocks project which I generated with cmake, changing only
>>>> >> >>>> the
>>>> >> >>>> 2 files
>>>> >> >>>> (physfs.c and physfs.h).  It compiles and builds just fine, but
>>>> >> >>>> I'm
>>>> >> >>>> getting
>>>> >> >>>> "undefined reference to PHYSFS_closeList" now.  What did I do
>>>> >> >>>> wrong?
>>>> >> >>>>
>>>> >> >>>>
>>>> >> >>>> On Mon, Aug 25, 2014 at 6:55 PM, Haydn Harach
>>>> >> >>>> <hharach at gmail.com>
>>>> >> >>>> wrote:
>>>> >> >>>>>
>>>> >> >>>>> Alrighty, here are the additions I've made to my physfs.c:
>>>> >> >>>>>
>>>> >> >>>>> PHYSFS_File **PHYSFS_openReadMulti(const char *_fname)
>>>> >> >>>>> {
>>>> >> >>>>>     char *fname;
>>>> >> >>>>>     size_t len;
>>>> >> >>>>>
>>>> >> >>>>>     BAIL_IF_MACRO(_fname == NULL, ERR_INVALID_ARGUMENT, 0);
>>>> >> >>>>>     len = strlen(_fname) + 1;
>>>> >> >>>>>     fname = (char *) __PHYSFS_smallAlloc(len);
>>>> >> >>>>>     BAIL_IF_MACRO(fname == NULL, ERR_OUT_OF_MEMORY, 0);
>>>> >> >>>>>
>>>> >> >>>>>     FileHandle** ret = NULL;
>>>> >> >>>>>     unsigned int retcount = 0;
>>>> >> >>>>>
>>>> >> >>>>>     if (sanitizePlatformIndependentPath(_fname, fname))
>>>> >> >>>>>     {
>>>> >> >>>>>         int fileExists = 0;
>>>> >> >>>>>         DirHandle *i = NULL;
>>>> >> >>>>>         fvoid *opaque = NULL;
>>>> >> >>>>>
>>>> >> >>>>>         __PHYSFS_platformGrabMutex(stateLock);
>>>> >> >>>>>
>>>> >> >>>>>         GOTO_IF_MACRO(!searchPath, ERR_NO_SUCH_PATH,
>>>> >> >>>>> openReadEnd);
>>>> >> >>>>>
>>>> >> >>>>>         /* !!! FIXME: Why aren't we using a for loop here? */
>>>> >> >>>>>         i = searchPath;
>>>> >> >>>>>
>>>> >> >>>>>         do
>>>> >> >>>>>         {
>>>> >> >>>>>             char *arcfname = fname;
>>>> >> >>>>>             if (verifyPath(i, &arcfname, 0))
>>>> >> >>>>>             {
>>>> >> >>>>>                 opaque = i->funcs->openRead(i->opaque,
>>>> >> >>>>> arcfname,
>>>> >> >>>>> &fileExists);
>>>> >> >>>>>                 if (opaque)
>>>> >> >>>>>                 {
>>>> >> >>>>>                    // We found a valid file, let's prepare it.
>>>> >> >>>>>                    FileHandle* h =
>>>> >> >>>>> (FileHandle*)allocator.Malloc(sizeof(FileHandle));
>>>> >> >>>>>                    if (h == NULL)
>>>> >> >>>>>                    {
>>>> >> >>>>>                       i->funcs->fileClose(opaque);
>>>> >> >>>>>                         GOTO_MACRO(ERR_OUT_OF_MEMORY,
>>>> >> >>>>> openReadEnd);
>>>> >> >>>>>                    }
>>>> >> >>>>>                    memset(h, 0, sizeof(FileHandle));
>>>> >> >>>>>                    h->opaque = opaque;
>>>> >> >>>>>                    h->forReading = 1;
>>>> >> >>>>>                    h->dirHandle = i;
>>>> >> >>>>>                    h->funcs = i->funcs;
>>>> >> >>>>>                    h->next = openReadList;
>>>> >> >>>>>                    openReadList = h;
>>>> >> >>>>>
>>>> >> >>>>>                      // Add the file to the list
>>>> >> >>>>>                      FileHandle** temp =
>>>> >> >>>>> (FileHandle**)allocator.Malloc(sizeof(FileHandle) * (retcount +
>>>> >> >>>>> 1));
>>>> >> >>>>>                      if (temp == NULL)
>>>> >> >>>>>                      {
>>>> >> >>>>>                         allocator.Free(h);
>>>> >> >>>>>                         i->funcs->fileClose(opaque);
>>>> >> >>>>>                         GOTO_MACRO(ERR_OUT_OF_MEMORY,
>>>> >> >>>>> openReadEnd);
>>>> >> >>>>>                      }
>>>> >> >>>>>                      if (ret != NULL)
>>>> >> >>>>>                      {
>>>> >> >>>>>                         memcpy(temp, ret, sizeof(FileHandle) *
>>>> >> >>>>> retcount);
>>>> >> >>>>>                         allocator.Free(ret);
>>>> >> >>>>>                      }
>>>> >> >>>>>                      temp[retcount] = h;
>>>> >> >>>>>                      ++retcount;
>>>> >> >>>>>                      ret = temp;
>>>> >> >>>>>                 }
>>>> >> >>>>>             } /* if */
>>>> >> >>>>>             i = i->next;
>>>> >> >>>>>         } while ((i != NULL) && (!fileExists));
>>>> >> >>>>>
>>>> >> >>>>>         // Add a null terminator to the list
>>>> >> >>>>>         if (ret != NULL)
>>>> >> >>>>>         {
>>>> >> >>>>>            FileHandle** temp =
>>>> >> >>>>> (FileHandle**)allocator.Malloc(sizeof(FileHandle) * (retcount +
>>>> >> >>>>> 1));
>>>> >> >>>>>            if (temp == NULL)
>>>> >> >>>>>                GOTO_MACRO(ERR_OUT_OF_MEMORY, openReadEnd);
>>>> >> >>>>>
>>>> >> >>>>>             memcpy(temp, ret, sizeof(FileHandle) * retcount);
>>>> >> >>>>>             allocator.Free(ret);
>>>> >> >>>>>
>>>> >> >>>>>             temp[retcount] = NULL;
>>>> >> >>>>>             ret = temp;
>>>> >> >>>>>         }
>>>> >> >>>>>
>>>> >> >>>>>         openReadEnd:
>>>> >> >>>>>         __PHYSFS_platformReleaseMutex(stateLock);
>>>> >> >>>>>     } /* if */
>>>> >> >>>>>
>>>> >> >>>>>     __PHYSFS_smallFree(fname);
>>>> >> >>>>>     return ret;
>>>> >> >>>>> } /* PHYSFS_openReadMulti */
>>>> >> >>>>>
>>>> >> >>>>> int PHYSFS_closeList(PHYSFS_file** list)
>>>> >> >>>>> {
>>>> >> >>>>>    int retval = 1;
>>>> >> >>>>>
>>>> >> >>>>>    for (PHYSFS_file** i = list; *i != NULL; ++i)
>>>> >> >>>>>    {
>>>> >> >>>>>       if (PHYSFS_close(*i) == 0)
>>>> >> >>>>>          retval = 0;
>>>> >> >>>>>    }
>>>> >> >>>>>
>>>> >> >>>>>    allocator.Free(list);
>>>> >> >>>>>    return retval;
>>>> >> >>>>> }
>>>> >> >>>>>
>>>> >> >>>>> Is there anything not immediately obvious that I'm missing?
>>>> >> >>>>>
>>>> >> >>>>>
>>>> >> >>>>> On Mon, Aug 25, 2014 at 6:11 PM, Edward Rudd
>>>> >> >>>>> <urkle at outoforder.cc>
>>>> >> >>>>> wrote:
>>>> >> >>>>>>
>>>> >> >>>>>> On Aug 25, 2014, at 8:06 PM, Haydn Harach <hharach at gmail.com>
>>>> >> >>>>>> wrote:
>>>> >> >>>>>>
>>>> >> >>>>>> > Looking at PHYSFS_openRead() in physfs.c, I've found this
>>>> >> >>>>>> > little
>>>> >> >>>>>> > snippet:
>>>> >> >>>>>> >
>>>> >> >>>>>> > do
>>>> >> >>>>>> >         {
>>>> >> >>>>>> >             char *arcfname = fname;
>>>> >> >>>>>> >             if (verifyPath(i, &arcfname, 0))
>>>> >> >>>>>> >             {
>>>> >> >>>>>> >                 opaque = i->funcs->openRead(i->opaque,
>>>> >> >>>>>> > arcfname,
>>>> >> >>>>>> > &fileExists);
>>>> >> >>>>>> >                 if (opaque)
>>>> >> >>>>>> >                     break;
>>>> >> >>>>>> >             } /* if */
>>>> >> >>>>>> >             i = i->next;
>>>> >> >>>>>> >         } while ((i != NULL) && (!fileExists));
>>>> >> >>>>>> >
>>>> >> >>>>>> > Now, from what I can see, this loop goes through all the
>>>> >> >>>>>> > paths,
>>>> >> >>>>>> > and
>>>> >> >>>>>> > the first one that satisfies the function and returns some
>>>> >> >>>>>> > data
>>>> >> >>>>>> > (from the
>>>> >> >>>>>> > openRead function) and causes 'opaque' to not be NULL, and
>>>> >> >>>>>> > thus
>>>> >> >>>>>> > breaks out
>>>> >> >>>>>> > of the loop.
>>>> >> >>>>>> >
>>>> >> >>>>>> > So, if I replaced "if (opaque) break;" with "if (opaque)
>>>> >> >>>>>> > someVector.emplace_back(opaque, i);", then did some cleanup
>>>> >> >>>>>> > to
>>>> >> >>>>>> > ensure that I
>>>> >> >>>>>> > have a vector of FileHandle's instead of one, and return
>>>> >> >>>>>> > that,
>>>> >> >>>>>> > this should
>>>> >> >>>>>> > be exactly what I'm looking for, yes?
>>>> >> >>>>>>
>>>> >> >>>>>> More or less, yes that would be exactly what you were looking
>>>> >> >>>>>> for.
>>>> >> >>>>>> _______________________________________________
>>>> >> >>>>>> physfs mailing list
>>>> >> >>>>>> physfs at icculus.org
>>>> >> >>>>>> http://icculus.org/mailman/listinfo/physfs
>>>> >> >>>>>
>>>> >> >>>>>
>>>> >> >>>>
>>>> >> >>>
>>>> >> >>>
>>>> >> >>> _______________________________________________
>>>> >> >>> physfs mailing list
>>>> >> >>> physfs at icculus.org
>>>> >> >>> http://icculus.org/mailman/listinfo/physfs
>>>> >> >>>
>>>> >> >>
>>>> >> >>
>>>> >> >> _______________________________________________
>>>> >> >> physfs mailing list
>>>> >> >> physfs at icculus.org
>>>> >> >> http://icculus.org/mailman/listinfo/physfs
>>>> >> >>
>>>> >> >
>>>> >> >
>>>> >> > _______________________________________________
>>>> >> > physfs mailing list
>>>> >> > physfs at icculus.org
>>>> >> > http://icculus.org/mailman/listinfo/physfs
>>>> >> >
>>>> >> _______________________________________________
>>>> >> physfs mailing list
>>>> >> physfs at icculus.org
>>>> >> http://icculus.org/mailman/listinfo/physfs
>>>> >
>>>> >
>>>> >
>>>> > _______________________________________________
>>>> > physfs mailing list
>>>> > physfs at icculus.org
>>>> > http://icculus.org/mailman/listinfo/physfs
>>>> >
>>>> _______________________________________________
>>>> physfs mailing list
>>>> physfs at icculus.org
>>>> http://icculus.org/mailman/listinfo/physfs
>>>
>>>
>>>
>>> _______________________________________________
>>> physfs mailing list
>>> physfs at icculus.org
>>> http://icculus.org/mailman/listinfo/physfs
>>>
>>
>> _______________________________________________
>> physfs mailing list
>> physfs at icculus.org
>> http://icculus.org/mailman/listinfo/physfs
>>
>
>
> _______________________________________________
> physfs mailing list
> physfs at icculus.org
> http://icculus.org/mailman/listinfo/physfs
>


More information about the physfs mailing list