1 // archive.cc -- archive support for gold
20 // The header of an entry in the archive. This is all readable text,
21 // padded with spaces where necesary. If the contents of an archive
22 // are all text file, the entire archive is readable.
24 struct Archive::Archive_header
28 // The file modification time.
30 // The user's UID in decimal.
32 // The user's GID in decimal.
34 // The file mode in octal.
36 // The file size in decimal.
38 // The final magic code.
44 const char Archive::armag
[sarmag
] =
46 '!', '<', 'a', 'r', 'c', 'h', '>', '\n'
49 const char Archive::arfmag
[2] = { '`', '\n' };
51 // Set up the archive: read the symbol map and the extended name
57 // The first member of the archive should be the symbol table.
58 std::string armap_name
;
59 off_t armap_size
= this->read_header(sarmag
, &armap_name
);
61 if (armap_name
.empty())
63 this->read_armap(sarmag
+ sizeof(Archive_header
), armap_size
);
64 off
= sarmag
+ sizeof(Archive_header
) + armap_size
;
66 else if (!this->input_file_
->options().include_whole_archive())
68 fprintf(stderr
, _("%s: %s: no archive symbol table (run ranlib)\n"),
69 program_name
, this->name().c_str());
75 // See if there is an extended name table.
79 off_t extended_size
= this->read_header(off
, &xname
);
82 const unsigned char* p
= this->get_view(off
+ sizeof(Archive_header
),
84 const char* px
= reinterpret_cast<const char*>(p
);
85 this->extended_names_
.assign(px
, extended_size
);
88 // Opening the file locked it. Unlock it now.
89 this->input_file_
->file().unlock();
92 // Read the archive symbol map.
95 Archive::read_armap(off_t start
, off_t size
)
97 // Read in the entire armap.
98 const unsigned char* p
= this->get_view(start
, size
);
100 // Numbers in the armap are always big-endian.
101 const elfcpp::Elf_Word
* pword
= reinterpret_cast<const elfcpp::Elf_Word
*>(p
);
102 unsigned int nsyms
= elfcpp::Swap
<32, true>::readval(pword
);
105 // Note that the addition is in units of sizeof(elfcpp::Elf_Word).
106 const char* pnames
= reinterpret_cast<const char*>(pword
+ nsyms
);
108 this->armap_
.resize(nsyms
);
110 for (unsigned int i
= 0; i
< nsyms
; ++i
)
112 this->armap_
[i
].name
= pnames
;
113 this->armap_
[i
].offset
= elfcpp::Swap
<32, true>::readval(pword
);
114 pnames
+= strlen(pnames
) + 1;
118 if (reinterpret_cast<const unsigned char*>(pnames
) - p
> size
)
120 fprintf(stderr
, _("%s: %s: bad archive symbol table names\n"),
121 program_name
, this->name().c_str());
125 // This array keeps track of which symbols are for archive elements
126 // which we have already included in the link.
127 this->seen_
.resize(nsyms
);
130 // Read the header of an archive member at OFF. Fail if something
131 // goes wrong. Return the size of the member. Set *PNAME to the name
135 Archive::read_header(off_t off
, std::string
* pname
)
137 const unsigned char* p
= this->get_view(off
, sizeof(Archive_header
));
138 const Archive_header
* hdr
= reinterpret_cast<const Archive_header
*>(p
);
139 return this->interpret_header(hdr
, off
, pname
);
142 // Interpret the header of HDR, the header of the archive member at
143 // file offset OFF. Fail if something goes wrong. Return the size of
144 // the member. Set *PNAME to the name of the member.
147 Archive::interpret_header(const Archive_header
* hdr
, off_t off
,
150 if (memcmp(hdr
->ar_fmag
, arfmag
, sizeof arfmag
) != 0)
152 fprintf(stderr
, _("%s; %s: malformed archive header at %ld\n"),
153 program_name
, this->name().c_str(),
154 static_cast<long>(off
));
158 const int size_string_size
= sizeof hdr
->ar_size
;
159 char size_string
[size_string_size
+ 1];
160 memcpy(size_string
, hdr
->ar_size
, size_string_size
);
161 char* ps
= size_string
+ size_string_size
;
162 while (ps
[-1] == ' ')
168 off_t member_size
= strtol(size_string
, &end
, 10);
171 || (member_size
== LONG_MAX
&& errno
== ERANGE
))
173 fprintf(stderr
, _("%s: %s: malformed archive header size at %ld\n"),
174 program_name
, this->name().c_str(),
175 static_cast<long>(off
));
179 if (hdr
->ar_name
[0] != '/')
181 const char* name_end
= strchr(hdr
->ar_name
, '/');
183 || name_end
- hdr
->ar_name
>= static_cast<int>(sizeof hdr
->ar_name
))
185 fprintf(stderr
, _("%s: %s: malformed archive header name at %ld\n"),
186 program_name
, this->name().c_str(),
187 static_cast<long>(off
));
190 pname
->assign(hdr
->ar_name
, name_end
- hdr
->ar_name
);
192 else if (hdr
->ar_name
[1] == ' ')
194 // This is the symbol table.
197 else if (hdr
->ar_name
[1] == '/')
199 // This is the extended name table.
200 pname
->assign(1, '/');
205 long x
= strtol(hdr
->ar_name
+ 1, &end
, 10);
208 || (x
== LONG_MAX
&& errno
== ERANGE
)
209 || static_cast<size_t>(x
) >= this->extended_names_
.size())
211 fprintf(stderr
, _("%s: %s: bad extended name index at %ld\n"),
212 program_name
, this->name().c_str(),
213 static_cast<long>(off
));
217 const char* name
= this->extended_names_
.data() + x
;
218 const char* name_end
= strchr(name
, '/');
219 if (static_cast<size_t>(name_end
- name
) > this->extended_names_
.size()
220 || name_end
[1] != '\n')
222 fprintf(stderr
, _("%s: %s: bad extended name entry at header %ld\n"),
223 program_name
, this->name().c_str(),
224 static_cast<long>(off
));
227 pname
->assign(name
, name_end
- name
);
233 // Select members from the archive and add them to the link. We walk
234 // through the elements in the archive map, and look each one up in
235 // the symbol table. If it exists as a strong undefined symbol, we
236 // pull in the corresponding element. We have to do this in a loop,
237 // since pulling in one element may create new undefined symbols which
238 // may be satisfied by other objects in the archive.
241 Archive::add_symbols(const General_options
& options
, Symbol_table
* symtab
,
242 Layout
* layout
, Input_objects
* input_objects
)
244 if (this->input_file_
->options().include_whole_archive())
245 return this->include_all_members(options
, symtab
, layout
, input_objects
);
247 const size_t armap_size
= this->armap_
.size();
249 bool added_new_object
;
252 added_new_object
= false;
254 for (size_t i
= 0; i
< armap_size
; ++i
)
258 if (this->armap_
[i
].offset
== last
)
260 this->seen_
[i
] = true;
264 Symbol
* sym
= symtab
->lookup(this->armap_
[i
].name
);
267 else if (!sym
->is_undefined())
269 this->seen_
[i
] = true;
272 else if (sym
->binding() == elfcpp::STB_WEAK
)
275 // We want to include this object in the link.
276 last
= this->armap_
[i
].offset
;
277 this->include_member(options
, symtab
, layout
, input_objects
, last
);
278 this->seen_
[i
] = true;
279 added_new_object
= true;
282 while (added_new_object
);
285 // Include all the archive members in the link. This is for --whole-archive.
288 Archive::include_all_members(const General_options
& options
,
289 Symbol_table
* symtab
, Layout
* layout
,
290 Input_objects
* input_objects
)
296 const unsigned char* p
= this->get_view(off
, sizeof(Archive_header
),
298 if (bytes
< sizeof(Archive_header
))
302 fprintf(stderr
, _("%s: %s: short archive header at %ld\n"),
303 program_name
, this->name().c_str(),
304 static_cast<long>(off
));
311 const Archive_header
* hdr
= reinterpret_cast<const Archive_header
*>(p
);
313 off_t size
= this->interpret_header(hdr
, off
, &name
);
318 else if (name
== "/")
320 // Extended name table.
323 this->include_member(options
, symtab
, layout
, input_objects
, off
);
325 off
+= sizeof(Archive_header
) + size
;
331 // Include an archive member in the link. OFF is the file offset of
332 // the member header.
335 Archive::include_member(const General_options
& options
, Symbol_table
* symtab
,
336 Layout
* layout
, Input_objects
* input_objects
,
340 this->read_header(off
, &n
);
342 size_t memoff
= off
+ sizeof(Archive_header
);
344 // Read enough of the file to pick up the entire ELF header.
345 int ehdr_size
= elfcpp::Elf_sizes
<64>::ehdr_size
;
347 const unsigned char* p
= this->input_file_
->file().get_view(memoff
,
352 fprintf(stderr
, _("%s: %s: member at %ld is not an ELF object"),
353 program_name
, this->name().c_str(),
354 static_cast<long>(off
));
358 static unsigned char elfmagic
[4] =
360 elfcpp::ELFMAG0
, elfcpp::ELFMAG1
,
361 elfcpp::ELFMAG2
, elfcpp::ELFMAG3
363 if (memcmp(p
, elfmagic
, 4) != 0)
365 fprintf(stderr
, _("%s: %s: member at %ld is not an ELF object"),
366 program_name
, this->name().c_str(),
367 static_cast<long>(off
));
371 Object
* obj
= make_elf_object((std::string(this->input_file_
->filename())
373 this->input_file_
, memoff
, p
, bytes
);
375 input_objects
->add_object(obj
);
377 Read_symbols_data sd
;
378 obj
->read_symbols(&sd
);
379 obj
->layout(options
, symtab
, layout
, &sd
);
380 obj
->add_symbols(symtab
, &sd
);
383 // Add_archive_symbols methods.
385 Add_archive_symbols::~Add_archive_symbols()
387 if (this->this_blocker_
!= NULL
)
388 delete this->this_blocker_
;
389 // next_blocker_ is deleted by the task associated with the next
393 // Return whether we can add the archive symbols. We are blocked by
394 // this_blocker_. We block next_blocker_. We also lock the file.
396 Task::Is_runnable_type
397 Add_archive_symbols::is_runnable(Workqueue
*)
399 if (this->this_blocker_
!= NULL
&& this->this_blocker_
->is_blocked())
404 class Add_archive_symbols::Add_archive_symbols_locker
: public Task_locker
407 Add_archive_symbols_locker(Task_token
& token
, Workqueue
* workqueue
,
409 : blocker_(token
, workqueue
), filelock_(file
)
413 Task_locker_block blocker_
;
414 Task_locker_obj
<File_read
> filelock_
;
418 Add_archive_symbols::locks(Workqueue
* workqueue
)
420 return new Add_archive_symbols_locker(*this->next_blocker_
,
422 this->archive_
->file());
426 Add_archive_symbols::run(Workqueue
*)
428 this->archive_
->add_symbols(this->options_
, this->symtab_
, this->layout_
,
429 this->input_objects_
);
431 if (this->input_group_
!= NULL
)
432 this->input_group_
->add_archive(this->archive_
);
435 // We no longer need to know about this archive.
436 delete this->archive_
;
440 } // End namespace gold.