Skip to content

Commit 2899088

Browse files
t0rr3sp3dr0wtdcode
andauthored
Allow Statically Linking in Go (#2067)
* unset -L and -rpath from CGO_LDFLAGS Signed-off-by: Pedro Tôrres <[email protected]> * allow go statically linking Signed-off-by: Pedro Tôrres <[email protected]> * fix setup.py --------- Signed-off-by: Pedro Tôrres <[email protected]> Co-authored-by: mio <[email protected]>
1 parent 7737e7b commit 2899088

File tree

7 files changed

+34
-77
lines changed

7 files changed

+34
-77
lines changed

CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -1515,6 +1515,7 @@ if(UNICORN_INSTALL AND NOT MSVC)
15151515
)
15161516
endif()
15171517
install(FILES $<TARGET_FILE:unicorn_archive> DESTINATION ${CMAKE_INSTALL_LIBDIR})
1518+
install(FILES $<TARGET_FILE_DIR:unicorn_archive>/$<TARGET_PROPERTY:unicorn_archive,SYMLINK_NAME> DESTINATION ${CMAKE_INSTALL_LIBDIR})
15181519
install(FILES ${UNICORN_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/unicorn)
15191520
if (ATOMIC_LINKAGE_FIX)
15201521
set(ATOMIC_LINK_PKG_CONFIG " -latomic")

bindings/go/unicorn/cgo.go

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package unicorn
2+
3+
// #cgo CFLAGS: -I../../../include -O3 -Wall -Werror
4+
import "C"

bindings/go/unicorn/cgo_dynamic.go

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
//go:build !static
2+
3+
package unicorn
4+
5+
// #cgo LDFLAGS: -lunicorn
6+
import "C"

bindings/go/unicorn/cgo_static.go

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//go:build static
2+
3+
package unicorn
4+
5+
// #cgo !darwin LDFLAGS: -lunicorn -lpthread -lm -latomic
6+
// #cgo darwin LDFLAGS: -lunicorn.o
7+
import "C"

bindings/go/unicorn/unicorn.go

-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@ import (
77
)
88

99
/*
10-
#cgo CFLAGS: -O3 -Wall -Werror -I../../../include
11-
#cgo LDFLAGS: -L../../../ -lunicorn -Wl,-rpath,${SRCDIR}/../../../
12-
#cgo linux LDFLAGS: -L../../../ -lunicorn -lrt -Wl,-rpath,${SRCDIR}/../../../
1310
#include <unicorn/unicorn.h>
1411
#include "uc.h"
1512
*/

bindings/python/setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def build_libraries():
113113

114114
obj_dir = os.path.join(BUILD_DIR, conf)
115115
shutil.copy(os.path.join(obj_dir, LIBRARY_FILE), LIBS_DIR)
116-
shutil.copy(os.path.join(BUILD_DIR, STATIC_LIBRARY_FILE), LIBS_DIR)
116+
shutil.copy(os.path.join(obj_dir, STATIC_LIBRARY_FILE), LIBS_DIR)
117117
else:
118118
cmake_args = ["cmake", '-B', BUILD_DIR, '-S', UC_DIR, "-DCMAKE_BUILD_TYPE=" + conf]
119119
if os.getenv("TRACE"):

cmake/bundle_static.cmake

+15-73
Original file line numberDiff line numberDiff line change
@@ -40,76 +40,18 @@ function(bundle_static_library tgt_name bundled_tgt_name library_name)
4040
list(REMOVE_DUPLICATES static_libs)
4141
list(REMOVE_DUPLICATES dep_libs)
4242

43-
set(bundled_tgt_full_name
44-
${CMAKE_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${library_name}${CMAKE_STATIC_LIBRARY_SUFFIX})
45-
46-
if (APPLE)
47-
find_program(lib_tool libtool REQUIRED)
48-
49-
foreach(tgt IN LISTS static_libs)
50-
list(APPEND static_libs_full_names $<TARGET_FILE:${tgt}>)
51-
endforeach()
52-
53-
add_custom_command(
54-
COMMAND ${lib_tool} -static -o ${bundled_tgt_full_name} ${static_libs_full_names}
55-
OUTPUT ${bundled_tgt_full_name}
56-
COMMENT "Bundling ${bundled_tgt_name}"
57-
VERBATIM)
58-
elseif(UNIX OR MINGW)
59-
file(WRITE ${CMAKE_BINARY_DIR}/${bundled_tgt_name}.ar.in
60-
"CREATE ${bundled_tgt_full_name}\n" )
61-
62-
foreach(tgt IN LISTS static_libs)
63-
file(APPEND ${CMAKE_BINARY_DIR}/${bundled_tgt_name}.ar.in
64-
"ADDLIB $<TARGET_FILE:${tgt}>\n")
65-
endforeach()
66-
67-
file(APPEND ${CMAKE_BINARY_DIR}/${bundled_tgt_name}.ar.in "SAVE\n")
68-
file(APPEND ${CMAKE_BINARY_DIR}/${bundled_tgt_name}.ar.in "END\n")
69-
70-
file(GENERATE
71-
OUTPUT ${CMAKE_BINARY_DIR}/${bundled_tgt_name}.ar
72-
INPUT ${CMAKE_BINARY_DIR}/${bundled_tgt_name}.ar.in)
73-
74-
set(ar_tool ${CMAKE_AR})
75-
if (CMAKE_INTERPROCEDURAL_OPTIMIZATION)
76-
set(ar_tool ${CMAKE_CXX_COMPILER_AR})
77-
endif()
78-
79-
add_custom_command(
80-
COMMAND ${ar_tool} -M < ${CMAKE_BINARY_DIR}/${bundled_tgt_name}.ar
81-
OUTPUT ${bundled_tgt_full_name}
82-
COMMENT "Bundling ${bundled_tgt_name}"
83-
VERBATIM)
84-
elseif(WIN32)
85-
# https://stackoverflow.com/a/38096930/1806760
86-
get_filename_component(vs_bin_path "${CMAKE_LINKER}" DIRECTORY)
87-
88-
find_program(lib_tool lib HINTS "${vs_bin_path}" REQUIRED)
89-
90-
foreach(tgt IN LISTS static_libs)
91-
list(APPEND static_libs_full_names $<TARGET_FILE:${tgt}>)
92-
endforeach()
93-
94-
add_custom_command(
95-
COMMAND ${lib_tool} /NOLOGO /OUT:${bundled_tgt_full_name} ${static_libs_full_names}
96-
OUTPUT ${bundled_tgt_full_name}
97-
COMMENT "Bundling ${bundled_tgt_name}"
98-
VERBATIM)
99-
else()
100-
message(FATAL_ERROR "Unknown bundle scenario!")
101-
endif()
102-
103-
add_custom_target(bundling_target ALL DEPENDS ${bundled_tgt_full_name})
104-
add_dependencies(bundling_target ${tgt_name})
105-
106-
add_library(${bundled_tgt_name} STATIC IMPORTED)
107-
set_target_properties(${bundled_tgt_name}
108-
PROPERTIES
109-
IMPORTED_LOCATION ${bundled_tgt_full_name}
110-
INTERFACE_INCLUDE_DIRECTORIES $<TARGET_PROPERTY:${tgt_name},INTERFACE_INCLUDE_DIRECTORIES>
111-
INTERFACE_LINK_LIBRARIES "${dep_libs}")
112-
#IMPORTED_LINK_INTERFACE_LIBRARIES "${dep_libs}") # Deprecated
113-
add_dependencies(${bundled_tgt_name} bundling_target)
114-
115-
endfunction()
43+
foreach(tgt IN LISTS static_libs)
44+
list(APPEND static_libs_objects $<TARGET_OBJECTS:${tgt}>)
45+
endforeach()
46+
47+
add_library(${bundled_tgt_name} STATIC ${static_libs_objects})
48+
set_target_properties(${bundled_tgt_name} PROPERTIES
49+
INTERFACE_INCLUDE_DIRECTORIES $<TARGET_PROPERTY:${tgt_name},INTERFACE_INCLUDE_DIRECTORIES>
50+
INTERFACE_LINK_LIBRARIES "${dep_libs}"
51+
OUTPUT_NAME "${library_name}"
52+
SYMLINK_NAME "${library_name}.o"
53+
)
54+
add_custom_command(TARGET ${bundled_tgt_name} POST_BUILD
55+
COMMAND ${CMAKE_COMMAND} -E create_symlink "$<TARGET_FILE_NAME:${bundled_tgt_name}>" "$<TARGET_FILE_DIR:${bundled_tgt_name}>/$<TARGET_PROPERTY:${bundled_tgt_name},SYMLINK_NAME>"
56+
)
57+
endfunction()

0 commit comments

Comments
 (0)