mirror of
https://github.com/rui314/mold.git
synced 2024-12-24 17:01:50 +03:00
Do not embed a library fullpath if it is given by -l
This commit is contained in:
parent
1f3931fc9e
commit
f9e91aa391
10
filepath.cc
10
filepath.cc
@ -19,7 +19,7 @@ std::string path_dirname(std::string_view path) {
|
|||||||
// Returns the filename part of a given path.
|
// Returns the filename part of a given path.
|
||||||
// Returns '/' if path reperesents the root directory.
|
// Returns '/' if path reperesents the root directory.
|
||||||
// Returns '.' if path is empty.
|
// Returns '.' if path is empty.
|
||||||
std::string path_filename(std::string_view path) {
|
std::string_view path_filename(std::string_view path) {
|
||||||
if (path.empty())
|
if (path.empty())
|
||||||
return ".";
|
return ".";
|
||||||
|
|
||||||
@ -31,14 +31,14 @@ std::string path_filename(std::string_view path) {
|
|||||||
|
|
||||||
i64 pos = path.find_last_of('/');
|
i64 pos = path.find_last_of('/');
|
||||||
if (pos == path.npos)
|
if (pos == path.npos)
|
||||||
return std::string(path);
|
return path;
|
||||||
return std::string(path.substr(pos + 1));
|
return path.substr(pos + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the filename part of a given path without the file
|
// Returns the filename part of a given path without the file
|
||||||
// extension.
|
// extension.
|
||||||
std::string path_basename(std::string_view path) {
|
std::string_view path_basename(std::string_view path) {
|
||||||
std::string name = path_filename(path);
|
std::string_view name = path_filename(path);
|
||||||
|
|
||||||
i64 pos = name.find_last_of('.');
|
i64 pos = name.find_last_of('.');
|
||||||
if (pos == name.npos)
|
if (pos == name.npos)
|
||||||
|
1
main.cc
1
main.cc
@ -264,6 +264,7 @@ static void read_input_files(Context<E> &ctx, std::span<std::string_view> args)
|
|||||||
state.pop_back();
|
state.pop_back();
|
||||||
} else if (read_arg(ctx, args, arg, "l")) {
|
} else if (read_arg(ctx, args, arg, "l")) {
|
||||||
MemoryMappedFile<E> *mb = find_library(ctx, std::string(arg));
|
MemoryMappedFile<E> *mb = find_library(ctx, std::string(arg));
|
||||||
|
mb->given_fullpath = false;
|
||||||
read_file(ctx, mb);
|
read_file(ctx, mb);
|
||||||
} else {
|
} else {
|
||||||
read_file(ctx, MemoryMappedFile<E>::must_open(ctx, std::string(args[0])));
|
read_file(ctx, MemoryMappedFile<E>::must_open(ctx, std::string(args[0])));
|
||||||
|
5
mold.h
5
mold.h
@ -883,6 +883,7 @@ public:
|
|||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
i64 mtime = 0;
|
i64 mtime = 0;
|
||||||
|
bool given_fullpath = true;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MemoryMappedFile(std::string name, u8 *data, u64 size, u64 mtime = 0)
|
MemoryMappedFile(std::string name, u8 *data, u64 size, u64 mtime = 0)
|
||||||
@ -1097,8 +1098,8 @@ protected:
|
|||||||
// These are various utility functions to deal with file pathnames.
|
// These are various utility functions to deal with file pathnames.
|
||||||
std::string get_current_dir();
|
std::string get_current_dir();
|
||||||
std::string path_dirname(std::string_view path);
|
std::string path_dirname(std::string_view path);
|
||||||
std::string path_filename(std::string_view path);
|
std::string_view path_filename(std::string_view path);
|
||||||
std::string path_basename(std::string_view path);
|
std::string_view path_basename(std::string_view path);
|
||||||
std::string path_to_absolute(std::string_view path);
|
std::string path_to_absolute(std::string_view path);
|
||||||
std::string path_clean(std::string_view path);
|
std::string path_clean(std::string_view path);
|
||||||
|
|
||||||
|
@ -1287,7 +1287,9 @@ std::string_view SharedFile<E>::get_soname(Context<E> &ctx) {
|
|||||||
for (ElfDyn<E> &dyn : this->template get_data<ElfDyn<E>>(ctx, *sec))
|
for (ElfDyn<E> &dyn : this->template get_data<ElfDyn<E>>(ctx, *sec))
|
||||||
if (dyn.d_tag == DT_SONAME)
|
if (dyn.d_tag == DT_SONAME)
|
||||||
return symbol_strtab.data() + dyn.d_val;
|
return symbol_strtab.data() + dyn.d_val;
|
||||||
return this->name;
|
if (this->mb->given_fullpath)
|
||||||
|
return this->name;
|
||||||
|
return path_filename(this->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename E>
|
template <typename E>
|
||||||
|
31
test/dt_needed.sh
Executable file
31
test/dt_needed.sh
Executable file
@ -0,0 +1,31 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
cd $(dirname $0)
|
||||||
|
echo -n "Testing $(basename -s .sh $0) ... "
|
||||||
|
t=$(pwd)/tmp/$(basename -s .sh $0)
|
||||||
|
mkdir -p $t
|
||||||
|
|
||||||
|
cat <<EOF | clang -c -o $t/a.o -xc -
|
||||||
|
void foo() {}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
clang -fuse-ld=`pwd`/../mold -shared -o $t/libfoo.so $t/a.o -Wl,--soname,libfoo
|
||||||
|
clang -fuse-ld=`pwd`/../mold -shared -o $t/libbar.so $t/a.o
|
||||||
|
|
||||||
|
cat <<EOF | clang -c -o $t/b.o -xc -
|
||||||
|
int main() {}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
clang -fuse-ld=`pwd`/../mold -o $t/exe $t/b.o $t/libfoo.so
|
||||||
|
readelf --dynamic $t/exe | fgrep -q 'Shared library: [libfoo]'
|
||||||
|
|
||||||
|
clang -fuse-ld=`pwd`/../mold -o $t/exe $t/b.o -L $t -lfoo
|
||||||
|
readelf --dynamic $t/exe | fgrep -q 'Shared library: [libfoo]'
|
||||||
|
|
||||||
|
clang -fuse-ld=`pwd`/../mold -o $t/exe $t/b.o $t/libbar.so
|
||||||
|
readelf --dynamic $t/exe | grep -Pq 'Shared library: \[.*dt_needed/libbar\.so\]'
|
||||||
|
|
||||||
|
clang -fuse-ld=`pwd`/../mold -o $t/exe $t/b.o -L$t -lbar
|
||||||
|
readelf --dynamic $t/exe | fgrep -q 'Shared library: [libbar.so]'
|
||||||
|
|
||||||
|
echo OK
|
@ -35,7 +35,7 @@ mkdir -p $t/script
|
|||||||
echo 'OUTPUT_FORMAT(elf32-i386)' > $t/script/libfoo.so
|
echo 'OUTPUT_FORMAT(elf32-i386)' > $t/script/libfoo.so
|
||||||
|
|
||||||
clang -fuse-ld=`pwd`/../mold -o $t/exe -L$t/script -L$t/lib32 -L$t/lib64 \
|
clang -fuse-ld=`pwd`/../mold -o $t/exe -L$t/script -L$t/lib32 -L$t/lib64 \
|
||||||
$t/e.o -lfoo >& $t/log
|
$t/e.o -lfoo -rpath $t/lib64 >& $t/log
|
||||||
|
|
||||||
grep -q 'script/libfoo.so: skipping incompatible file' $t/log
|
grep -q 'script/libfoo.so: skipping incompatible file' $t/log
|
||||||
grep -q 'lib32/libfoo.so: skipping incompatible file' $t/log
|
grep -q 'lib32/libfoo.so: skipping incompatible file' $t/log
|
||||||
|
@ -6,13 +6,10 @@ t=$(pwd)/tmp/$(basename -s .sh $0)
|
|||||||
mkdir -p $t
|
mkdir -p $t
|
||||||
|
|
||||||
cat <<EOF | clang -fPIC -c -o $t/a.o -xc -
|
cat <<EOF | clang -fPIC -c -o $t/a.o -xc -
|
||||||
int foo() {
|
void foo() {}
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
clang -fuse-ld=`pwd`/../mold -o $t/b.so -shared $t/a.o -Wl,-soname,foo
|
clang -fuse-ld=`pwd`/../mold -o $t/b.so -shared $t/a.o -Wl,-soname,foo
|
||||||
readelf --dynamic $t/b.so > $t/log
|
readelf --dynamic $t/b.so | fgrep -q 'Library soname: [foo]'
|
||||||
fgrep -q 'Library soname: [foo]' $t/log
|
|
||||||
|
|
||||||
echo OK
|
echo OK
|
||||||
|
Loading…
Reference in New Issue
Block a user