Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
GHC
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
0
Merge Requests
0
Requirements
Requirements
List
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Package Registry
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issue
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Alex D
GHC
Commits
93f9244e
Commit
93f9244e
authored
Nov 27, 2010
by
Ian Lynagh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Re-indent only
parent
9e210359
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
137 additions
and
133 deletions
+137
-133
rts/Linker.c
rts/Linker.c
+137
-133
No files found.
rts/Linker.c
View file @
93f9244e
...
...
@@ -1673,157 +1673,161 @@ mkOc( char *path, char *image, int imageSize,
HsInt
loadArchive
(
char
*
path
)
{
ObjectCode
*
oc
;
char
*
image
;
int
imageSize
;
FILE
*
f
;
int
n
;
size_t
fileNameSize
;
char
*
file
;
size_t
fileSize
;
int
isObject
;
char
tmp
[
12
];
IF_DEBUG
(
linker
,
debugBelch
(
"loadArchive: Loading archive `%s'
\n
"
,
path
));
fileSize
=
32
;
file
=
stgMallocBytes
(
fileSize
,
"loadArchive(file)"
);
f
=
fopen
(
path
,
"rb"
);
if
(
!
f
)
barf
(
"loadObj: can't read `%s'"
,
path
);
n
=
fread
(
tmp
,
1
,
8
,
f
);
if
(
strncmp
(
tmp
,
"!<arch>
\n
"
,
8
)
!=
0
)
barf
(
"loadArchive: Not an archive: `%s'"
,
path
);
while
(
1
)
{
n
=
fread
(
file
,
1
,
16
,
f
);
if
(
n
!=
16
)
{
if
(
feof
(
f
))
{
break
;
}
else
{
barf
(
"loadArchive: Failed reading file name from `%s'"
,
path
);
}
}
n
=
fread
(
tmp
,
1
,
12
,
f
);
if
(
n
!=
12
)
barf
(
"loadArchive: Failed reading mod time from `%s'"
,
path
);
n
=
fread
(
tmp
,
1
,
6
,
f
);
if
(
n
!=
6
)
barf
(
"loadArchive: Failed reading owner from `%s'"
,
path
);
n
=
fread
(
tmp
,
1
,
6
,
f
);
if
(
n
!=
6
)
barf
(
"loadArchive: Failed reading group from `%s'"
,
path
);
n
=
fread
(
tmp
,
1
,
8
,
f
);
if
(
n
!=
8
)
barf
(
"loadArchive: Failed reading mode from `%s'"
,
path
);
n
=
fread
(
tmp
,
1
,
10
,
f
);
if
(
n
!=
10
)
barf
(
"loadArchive: Failed reading size from `%s'"
,
path
);
tmp
[
10
]
=
'\0'
;
for
(
n
=
0
;
isdigit
(
tmp
[
n
]);
n
++
);
tmp
[
n
]
=
'\0'
;
imageSize
=
atoi
(
tmp
);
n
=
fread
(
tmp
,
1
,
2
,
f
);
if
(
strncmp
(
tmp
,
"
\x60\x0A
"
,
2
)
!=
0
)
barf
(
"loadArchive: Failed reading magic from `%s' at %ld. Got %c%c"
,
path
,
ftell
(
f
),
tmp
[
0
],
tmp
[
1
]);
/* Check for BSD-variant large filenames */
if
(
0
==
strncmp
(
file
,
"#1/"
,
3
))
{
file
[
16
]
=
'\0'
;
for
(
n
=
3
;
isdigit
(
file
[
n
]);
n
++
);
file
[
n
]
=
'\0'
;
fileNameSize
=
atoi
(
file
+
3
);
imageSize
-=
fileNameSize
;
if
(
fileNameSize
>
fileSize
)
{
/* Double it to avoid potentially continually
increasing it by 1 */
fileSize
=
fileNameSize
*
2
;
file
=
stgReallocBytes
(
file
,
fileSize
,
"loadArchive(file)"
);
}
n
=
fread
(
file
,
1
,
fileNameSize
,
f
);
if
(
n
!=
(
int
)
fileNameSize
)
barf
(
"loadArchive: Failed reading filename from `%s'"
,
path
);
}
else
{
fileNameSize
=
16
;
}
ObjectCode
*
oc
;
char
*
image
;
int
imageSize
;
FILE
*
f
;
int
n
;
size_t
fileNameSize
;
char
*
file
;
size_t
fileSize
;
int
isObject
;
char
tmp
[
12
];
IF_DEBUG
(
linker
,
debugBelch
(
"loadArchive: Loading archive `%s'
\n
"
,
path
));
fileSize
=
32
;
file
=
stgMallocBytes
(
fileSize
,
"loadArchive(file)"
);
f
=
fopen
(
path
,
"rb"
);
if
(
!
f
)
barf
(
"loadObj: can't read `%s'"
,
path
);
n
=
fread
(
tmp
,
1
,
8
,
f
);
if
(
strncmp
(
tmp
,
"!<arch>
\n
"
,
8
)
!=
0
)
barf
(
"loadArchive: Not an archive: `%s'"
,
path
);
while
(
1
)
{
n
=
fread
(
file
,
1
,
16
,
f
);
if
(
n
!=
16
)
{
if
(
feof
(
f
))
{
break
;
}
else
{
barf
(
"loadArchive: Failed reading file name from `%s'"
,
path
);
}
}
n
=
fread
(
tmp
,
1
,
12
,
f
);
if
(
n
!=
12
)
barf
(
"loadArchive: Failed reading mod time from `%s'"
,
path
);
n
=
fread
(
tmp
,
1
,
6
,
f
);
if
(
n
!=
6
)
barf
(
"loadArchive: Failed reading owner from `%s'"
,
path
);
n
=
fread
(
tmp
,
1
,
6
,
f
);
if
(
n
!=
6
)
barf
(
"loadArchive: Failed reading group from `%s'"
,
path
);
n
=
fread
(
tmp
,
1
,
8
,
f
);
if
(
n
!=
8
)
barf
(
"loadArchive: Failed reading mode from `%s'"
,
path
);
n
=
fread
(
tmp
,
1
,
10
,
f
);
if
(
n
!=
10
)
barf
(
"loadArchive: Failed reading size from `%s'"
,
path
);
tmp
[
10
]
=
'\0'
;
for
(
n
=
0
;
isdigit
(
tmp
[
n
]);
n
++
);
tmp
[
n
]
=
'\0'
;
imageSize
=
atoi
(
tmp
);
n
=
fread
(
tmp
,
1
,
2
,
f
);
if
(
strncmp
(
tmp
,
"
\x60\x0A
"
,
2
)
!=
0
)
barf
(
"loadArchive: Failed reading magic from `%s' at %ld. Got %c%c"
,
path
,
ftell
(
f
),
tmp
[
0
],
tmp
[
1
]);
/* Check for BSD-variant large filenames */
if
(
0
==
strncmp
(
file
,
"#1/"
,
3
))
{
file
[
16
]
=
'\0'
;
for
(
n
=
3
;
isdigit
(
file
[
n
]);
n
++
);
file
[
n
]
=
'\0'
;
fileNameSize
=
atoi
(
file
+
3
);
imageSize
-=
fileNameSize
;
if
(
fileNameSize
>
fileSize
)
{
/* Double it to avoid potentially continually
increasing it by 1 */
fileSize
=
fileNameSize
*
2
;
file
=
stgReallocBytes
(
file
,
fileSize
,
"loadArchive(file)"
);
}
n
=
fread
(
file
,
1
,
fileNameSize
,
f
);
if
(
n
!=
(
int
)
fileNameSize
)
barf
(
"loadArchive: Failed reading filename from `%s'"
,
path
);
}
else
{
fileNameSize
=
16
;
}
IF_DEBUG
(
linker
,
debugBelch
(
"loadArchive: Found member file `%s'
\n
"
,
file
));
IF_DEBUG
(
linker
,
debugBelch
(
"loadArchive: Found member file `%s'
\n
"
,
file
));
isObject
=
0
;
for
(
n
=
0
;
n
<
(
int
)
fileNameSize
-
1
;
n
++
)
{
if
((
file
[
n
]
==
'.'
)
&&
(
file
[
n
+
1
]
==
'o'
))
{
isObject
=
1
;
break
;
}
}
isObject
=
0
;
for
(
n
=
0
;
n
<
(
int
)
fileNameSize
-
1
;
n
++
)
{
if
((
file
[
n
]
==
'.'
)
&&
(
file
[
n
+
1
]
==
'o'
))
{
isObject
=
1
;
break
;
}
}
if
(
isObject
)
{
char
*
archiveMemberName
;
if
(
isObject
)
{
char
*
archiveMemberName
;
IF_DEBUG
(
linker
,
debugBelch
(
"loadArchive: Member is an object file...loading...
\n
"
));
IF_DEBUG
(
linker
,
debugBelch
(
"loadArchive: Member is an object file...loading...
\n
"
));
/* We can't mmap from the archive directly, as object
files need to be 8-byte aligned but files in .ar
archives are 2-byte aligned. When possible we use mmap
to get some anonymous memory, as on 64-bit platforms if
we use malloc then we can be given memory above 2^32.
In the mmap case we're probably wasting lots of space;
we could do better. */
/* We can't mmap from the archive directly, as object
files need to be 8-byte aligned but files in .ar
archives are 2-byte aligned. When possible we use mmap
to get some anonymous memory, as on 64-bit platforms if
we use malloc then we can be given memory above 2^32.
In the mmap case we're probably wasting lots of space;
we could do better. */
#ifdef USE_MMAP
image
=
mmapForLinker
(
imageSize
,
MAP_ANONYMOUS
,
-
1
);
image
=
mmapForLinker
(
imageSize
,
MAP_ANONYMOUS
,
-
1
);
#else
image
=
stgMallocBytes
(
imageSize
,
"loadArchive(image)"
);
image
=
stgMallocBytes
(
imageSize
,
"loadArchive(image)"
);
#endif
n
=
fread
(
image
,
1
,
imageSize
,
f
);
if
(
n
!=
imageSize
)
barf
(
"loadObj: error whilst reading `%s'"
,
path
);
n
=
fread
(
image
,
1
,
imageSize
,
f
);
if
(
n
!=
imageSize
)
barf
(
"loadObj: error whilst reading `%s'"
,
path
);
archiveMemberName
=
stgMallocBytes
(
strlen
(
path
)
+
fileNameSize
+
3
,
"loadArchive(file)"
);
sprintf
(
archiveMemberName
,
"%s(%.*s)"
,
path
,
(
int
)
fileNameSize
,
file
);
archiveMemberName
=
stgMallocBytes
(
strlen
(
path
)
+
fileNameSize
+
3
,
"loadArchive(file)"
);
sprintf
(
archiveMemberName
,
"%s(%.*s)"
,
path
,
(
int
)
fileNameSize
,
file
);
oc
=
mkOc
(
path
,
image
,
imageSize
,
archiveMemberName
oc
=
mkOc
(
path
,
image
,
imageSize
,
archiveMemberName
#ifndef USE_MMAP
#ifdef darwin_HOST_OS
,
0
,
0
#endif
#endif
);
);
stgFree
(
archiveMemberName
);
stgFree
(
archiveMemberName
);
if
(
0
==
loadOc
(
oc
))
{
stgFree
(
file
);
return
0
;
}
}
else
{
n
=
fseek
(
f
,
imageSize
,
SEEK_CUR
);
if
(
n
!=
0
)
barf
(
"loadArchive: error whilst seeking by %d in `%s'"
,
imageSize
,
path
);
}
/* .ar files are 2-byte aligned */
if
(
imageSize
%
2
)
{
n
=
fread
(
tmp
,
1
,
1
,
f
);
if
(
n
!=
1
)
{
if
(
feof
(
f
))
{
break
;
}
else
{
barf
(
"loadArchive: Failed reading padding from `%s'"
,
path
);
}
}
}
}
if
(
0
==
loadOc
(
oc
))
{
stgFree
(
file
);
return
0
;
}
}
else
{
n
=
fseek
(
f
,
imageSize
,
SEEK_CUR
);
if
(
n
!=
0
)
barf
(
"loadArchive: error whilst seeking by %d in `%s'"
,
imageSize
,
path
);
}
/* .ar files are 2-byte aligned */
if
(
imageSize
%
2
)
{
n
=
fread
(
tmp
,
1
,
1
,
f
);
if
(
n
!=
1
)
{
if
(
feof
(
f
))
{
break
;
}
else
{
barf
(
"loadArchive: Failed reading padding from `%s'"
,
path
);
}
}
}
}
fclose
(
f
);
fclose
(
f
);
stgFree
(
file
);
return
1
;
stgFree
(
file
);
return
1
;
}
/* -----------------------------------------------------------------------------
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment