/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.soloader;
import java.io.File;
import java.io.IOException;
/**
* {@link SoSource} that finds shared libraries in a given directory.
*/
public class DirectorySoSource extends SoSource {
public static final int RESOLVE_DEPENDENCIES = 1;
public static final int ON_LD_LIBRARY_PATH = 2;
protected final File soDirectory;
private final int flags;
/**
* Make a new DirectorySoSource. If {@code flags} contains {@code RESOLVE_DEPENDENCIES},
* recursively load dependencies for shared objects loaded from this directory. (We shouldn't
* need to resolve dependencies for libraries loaded from system directories: the dynamic linker
* is smart enough to do it on its own there.)
*/
public DirectorySoSource(File soDirectory, int flags) {
this.soDirectory = soDirectory;
this.flags = flags;
}
@Override
public int loadLibrary(String soName, int loadFlags) throws IOException {
File soFile = new File(soDirectory, soName);
if (!soFile.exists()) {
return LOAD_RESULT_NOT_FOUND;
}
if ((loadFlags & LOAD_FLAG_ALLOW_IMPLICIT_PROVISION) != 0 &&
(flags & ON_LD_LIBRARY_PATH) != 0) {
return LOAD_RESULT_IMPLICITLY_PROVIDED;
}
if ((flags & RESOLVE_DEPENDENCIES) != 0) {
String dependencies[] = MinElf.extract_DT_NEEDED(soFile);
for (int i = 0; i < dependencies.length; ++i) {
String dependency = dependencies[i];
if (dependency.startsWith("/")) {
continue;
}
SoLoader.loadLibraryBySoName(
dependency,
(loadFlags | LOAD_FLAG_ALLOW_IMPLICIT_PROVISION));
}
}
System.load(soFile.getAbsolutePath());
return LOAD_RESULT_LOADED;
}
@Override
public File unpackLibrary(String soName) throws IOException {
File soFile = new File(soDirectory, soName);
if (soFile.exists()) {
return soFile;
}
return null;
}
}