ListLoaded() fixes for 64 bit archs
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40455 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -294,13 +294,13 @@ class wxDynamicLibraryDetailsCreator
|
|||||||
public:
|
public:
|
||||||
// create a new wxDynamicLibraryDetails from the given data
|
// create a new wxDynamicLibraryDetails from the given data
|
||||||
static wxDynamicLibraryDetails *
|
static wxDynamicLibraryDetails *
|
||||||
New(unsigned long start, unsigned long end, const wxString& path)
|
New(void *start, void *end, const wxString& path)
|
||||||
{
|
{
|
||||||
wxDynamicLibraryDetails *details = new wxDynamicLibraryDetails;
|
wxDynamicLibraryDetails *details = new wxDynamicLibraryDetails;
|
||||||
details->m_path = path;
|
details->m_path = path;
|
||||||
details->m_name = path.AfterLast(_T('/'));
|
details->m_name = path.AfterLast(_T('/'));
|
||||||
details->m_address = wxUIntToPtr(start);
|
details->m_address = start;
|
||||||
details->m_length = end - start;
|
details->m_length = (char *)end - (char *)start;
|
||||||
|
|
||||||
// try to extract the library version from its name
|
// try to extract the library version from its name
|
||||||
const size_t posExt = path.rfind(_T(".so"));
|
const size_t posExt = path.rfind(_T(".so"));
|
||||||
@@ -339,16 +339,17 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded()
|
|||||||
{
|
{
|
||||||
// details of the module currently being parsed
|
// details of the module currently being parsed
|
||||||
wxString pathCur;
|
wxString pathCur;
|
||||||
unsigned long startCur = 0,
|
void *startCur = NULL,
|
||||||
endCur = 0;
|
*endCur = NULL;
|
||||||
|
|
||||||
char path[1024];
|
char path[1024];
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
while ( fgets(buf, WXSIZEOF(buf), file.fp()) )
|
while ( fgets(buf, WXSIZEOF(buf), file.fp()) )
|
||||||
{
|
{
|
||||||
// format is: start-end perm something? maj:min inode path
|
// format is: "start-end perm offset maj:min inode path", see proc(5)
|
||||||
unsigned long start, end;
|
void *start,
|
||||||
switch ( sscanf(buf, "%08lx-%08lx %*4s %*08x %*02x:%*02x %*d %1024s\n",
|
*end;
|
||||||
|
switch ( sscanf(buf, "%p-%p %*4s %*p %*02x:%*02x %*d %1024s\n",
|
||||||
&start, &end, path) )
|
&start, &end, path) )
|
||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
@@ -368,6 +369,9 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxASSERT_MSG( start >= endCur,
|
||||||
|
_T("overlapping regions in /proc/self/maps?") );
|
||||||
|
|
||||||
wxString pathNew = wxString::FromAscii(path);
|
wxString pathNew = wxString::FromAscii(path);
|
||||||
if ( pathCur.empty() )
|
if ( pathCur.empty() )
|
||||||
{
|
{
|
||||||
@@ -376,10 +380,9 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded()
|
|||||||
startCur = start;
|
startCur = start;
|
||||||
endCur = end;
|
endCur = end;
|
||||||
}
|
}
|
||||||
else if ( pathCur == pathNew )
|
else if ( pathCur == pathNew && endCur == end )
|
||||||
{
|
{
|
||||||
// continuation of the same module
|
// continuation of the same module in the address space
|
||||||
wxASSERT_MSG( start == endCur, _T("hole in /proc/self/maps?") );
|
|
||||||
endCur = end;
|
endCur = end;
|
||||||
}
|
}
|
||||||
else // end of the current module
|
else // end of the current module
|
||||||
|
Reference in New Issue
Block a user