blob: de113eb829a2e3d3bcca9f507f5eeea03f8a8213 [file] [log] [blame]
Linus Walleij0dd71e92006-05-04 18:47:07 +00001Building and Installing
2-----------------------
Linus Walleij6fd2f082006-03-28 07:19:22 +00003
Linus Walleij0dd71e92006-05-04 18:47:07 +00004See the "INSTALL" file.
5
6
7Heritage
8--------
9
10libmtp is based on several ancestors:
11
12* libptp2 by Mariusz Woloszyn was the starting point used
13 by Richard A. Low for the initial starter port. You can
14 find it at http://libptp.sourceforge.net/
15
16* libgphoto2 by Mariusz Woloszyn and Marcus Meissner was
17 used at a later stage since it was (is) more actively
18 maintained. libmtp tracks the PTP implementation in
19 libgphoto2 and considers it an upstream project. We will
20 try to submit anything generally useful back to libgphoto2
21 and not make double efforts. In practice this means we
22 use ptp.c, ptp.h and ptp-pack.c verbatim from the libgphoto2
23 source code. If you need to change things in these files,
24 make sure it is so general that libgphoto2 will want to
25 merge it to their codebase too. You find libgphoto2 as part
26 of gPhoto: http://gphoto.sourceforge.net/
27
28* libnjb was a project that Richard and Linus were working
Linus Walleijfcf88912006-06-05 13:23:33 +000029 on before libmtp. When Linus took Richards initial port
Linus Walleij0dd71e92006-05-04 18:47:07 +000030 and made an generic C API he re-used the philosophy and
31 much code from libnjb. Many of the sample programs are for
32 example taken quite literally from libnjb. You find it here:
33 http://libnjb.sourceforge.net/
34
35
36Compiling programs for libmtp
37-----------------------------
38
39libmtp has support for the pkg-config script by adding a libmtp.pc
40entry in $(prefix)/lib/pkgconfig. To compile a libmtp program,
41"just" write:
42
43gcc -o foo `pkg-config --cflags --libs libmtp` foo.c
44
45This also simplifies compilation using autoconf and pkg-config: just
46write e.g.
47
48PKG_CHECK_MODULES(MTP, libmtp)
49AC_SUBST(MTP_CFLAGS)
50AC_SUBST(MTP_LIBS)
51
52To have libmtp LIBS and CFLAGS defined. Needless to say, this will
53only work if you have pkgconfig installed on your system, but most
54people have nowadays.
55
56If your library is installed in e.g. /usr/local you may have to tell
57this to pkgconfig by setting the PKG_CONFIG_PATH thus:
58
59export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
60
61
62Documentation
63-------------
64
65Read the API documentation that can be generated with doxygen.
66It will be output in doc/html if you have Doxygen properly
67installed. (It will not be created unless you have Doxygen!)
68
69For information about the Media Transfer Protocol, see:
70http://en.wikipedia.org/wiki/Media_Transfer_Protocol
71
Linus Walleij7a83e552008-07-29 21:30:43 +000072The official 1.0 specification for MTP was released by the
73USB Implementers Forum in may, 2008. Prior to this, only a
74proprietary Microsoft version was available, and quite a few
75devices out there still use some aspects of the Microsoft
76version, which deviates from the specified standard. You can
77find the official specification here:
78http://www.usb.org/developers/devclass_docs/MTP_1.0.zip
Linus Walleij0dd71e92006-05-04 18:47:07 +000079
80Contributing
81------------
82
83See the project page at http://libmtp.sourceforge.net/
Linus Walleijee73ef22006-08-27 19:56:00 +000084We always need your help. There is a mailinglist and a
85bug report system there.
Linus Walleij6fd2f082006-03-28 07:19:22 +000086
Linus Walleija1b66f22007-05-10 20:02:16 +000087
88New Devices
89-----------
90
Linus Walleijfcf88912006-06-05 13:23:33 +000091If you happen upon a device which libmtp claims it cannot
92autodetect, please submit the vendor ID and device ID
Linus Walleij9ee29402007-10-31 20:24:48 +000093(these can be obtained from the "lsusb" and "lsusb -n"
94commands run as root) as a bug, patch or feature request
95on the Sourceforge bug tracker at our homepage. If it
96gives a sensible output from "mtp-detect" then please attach
97the result as well as it teach us some stuff about your
98device. If you've done some additional hacking, join our
99mailinglist and post your experiences there.
Linus Walleijda558be2007-03-10 21:42:25 +0000100
Linus Walleija1b66f22007-05-10 20:02:16 +0000101If you want to be able to hack some more and you're not
102afraid of C hacking, add an entry for your device's
103vendor/product ID and a descriptive string to the database
Linus Walleij6dc01682007-11-15 21:23:46 +0000104in the file src/music-players.h.
Linus Walleija1b66f22007-05-10 20:02:16 +0000105
106If you want to poke around to see if your device has some
107special pecularities, you can test some special device
Linus Walleij6dc01682007-11-15 21:23:46 +0000108flags (defined in src/device-flags.h) by inserting them
109together with your device entry in src/music-players.h.
Linus Walleija1b66f22007-05-10 20:02:16 +0000110Flags can be tested in isolation or catenated with "|"
111(binary OR). If relatives to your device use a certain
112flag, chances are high that a new device will need it
113too, typically from the same manufacturer.
114
115The most common flag that needs to be set is the
116DEVICE_FLAG_UNLOAD_DRIVER that detach any Linux kernel
117drivers that may have attached to the device making
Linus Walleij94f23d52007-08-04 19:37:28 +0000118MTP access impossible. This is however not expected to
119really work: this is a problem being tracked as of
120now (2007-08-04). See the "last resort" solutions below
121if you really need to get your dual-mode device to work
122with MTP.
Linus Walleija1b66f22007-05-10 20:02:16 +0000123
Linus Walleijcc2cf972007-11-22 20:23:43 +0000124Another flag which is easy to identify is the
125DEVICE_FLAG_NO_ZERO_READS, which remedies connection
126timeouts when getting files, and some timeouts on e.g.
127successive "mtp-connect" calls.
128
Linus Walleij91fb0282007-09-03 21:16:08 +0000129If you are a device vendor, please consider assigning one
130of your employees as a contact person for libmtp, have them
131sign up to the libmtp development list and answer questions
132and post new device ID:s as they are released to our
133mailing list. By the way: do you have spare devices you
134can give us? Send them to Richard (Mac support) or Linus
135(Linux support). (So far nobody did that except for Microsoft
136who sent us a Zune by proxy!)
137
Linus Walleija1b66f22007-05-10 20:02:16 +0000138If your device is very problematic we are curious of how it
Linus Walleijda558be2007-03-10 21:42:25 +0000139works under Windows, so we enjoy reading USB packet sniffs
140that reveal the low-level traffic carried out between
141Windows Media Player and your device. This can be done
Linus Walleij61c25682007-09-04 14:46:21 +0000142using e.g.:
143
144* USBsnoop:
145 http://benoit.papillault.free.fr/usbsnoop/
146
147* The trial version of HHD Softwares software-only
148 USB monitor. You need to get a copy of version 2.37 since
149 the newer trial versions won't let you carry out the
150 needed packet sniffs. (As of 2007-03-10 a copy can be found
151 at: http://www.cobbleware.com/files/usb-monitor-237.exe)
152
Linus Walleijda558be2007-03-10 21:42:25 +0000153There are other USB monitors as well, some more expensive
154alternatives use hardware and even measure electronic
155characteristics of the traffic (which is far too much
156detail for us).
157
Linus Walleij91fb0282007-09-03 21:16:08 +0000158Device sniffs are an easy read since the PTP/MTP protocol
159is nicely structured. All commands will have a structure such
160as this in the log, we examplify with a object list request:
161
162PTP REQEUST:
163000120: Bulk or Interrupt Transfer (UP), 03.09.2007 12:49:25.9843750 +0.0
164Pipe Handle: 0x863ce234 (Endpoint Address: 0x2)
165Send 0x20 bytes to the device:
166 20 00 00 00 01 00 05 98 23 00 00 00 27 03 00 10 ......?#...'...
167 Length TYPE CMD Trans# Param1
168
169 00 00 00 00 02 DC 00 00 00 00 00 00 00 00 00 00 .....Ü..........
170 Param2 Param3 Param4 Param5
171
172[OPTIONAL] DATA PHASE:
173000121: Bulk or Interrupt Transfer (UP), 03.09.2007 12:49:26.0 +0.0156250
174Pipe Handle: 0x863ce214 (Endpoint Address: 0x81)
175Get 0x1a bytes from the device:
176 1A 00 00 00 02 00 05 98 23 00 00 00 01 00 00 00 .......?#.......
177 Length TYPE CMD Trans# DATA
178
179 27 03 00 10 02 DC 04 00 00 30 '....Ü...0
180
181RESPONSE:
182000122: Bulk or Interrupt Transfer (UP), 03.09.2007 12:49:26.0 +0.0
183Pipe Handle: 0x863ce214 (Endpoint Address: 0x81)
184Get 0xc bytes from the device:
185 0C 00 00 00 03 00 01 20 23 00 00 00 ....... #...
186 Length TYPE CODE Trans#
187
188* One send (OUT to the device), two reads (IN from the device).
189
190* All three byte chunks commands are
191 sent/recieved/recieeved by the function ptp_transaction()
192 in the file ptp.c.
193
194* It boils down to ptp_usb_sendreq(), optionally ptp_usb_senddata()
195 or ptp_usb_getdata() and finally ptp_usb_getresp() in the file
196 libusb-glue.c. Notice ptp_usb_sendreq() and ptp_usb_getresp()
197 are ALWAYS called. The TYPE field correspond to this, so the
198 TYPES in this case are "COMMAND" (0x0001), "DATA" (0x0002),
199 and "RESPONSE" (0x0003).
200
201* Notice that the byte order is little endian, so you need to read
202 each field from right to left.
203
204* This COMMAND has:
205 CMD 0x99805, we see in ptp.h that this is PTP_OC_MTP_GetObjPropList.
206 Transaction# 0x00000023.
207 REQUEST parameters 0x10000327, 0x00000000, 0x0000DC02, 0x00000000
208 0x00000000, in this case it means "get props for object 0x10000327",
209 "any format", "property 0xDC02" (PTP_OPC_ObjectFormat), then two
210 parameters that are always zero (no idea what they mean or their
211 use).
212
213* The DATA has:
214 CMD 0x99805, we see in ptp.h that this is PTP_OC_MTP_GetObjPropList.
215 Transaction# 0x00000023.
216 Then comes data 0x00000001, 0x10000327, 0xDC02, 0x0004, 0x3000
217 Which means in this case, (and this is the tricky part) "here
218 you have 1 property", "for object 0x10000327", "it is property
219 0xDC02" (PTP_OPC_ObjectFormat), "which is of type 0x0004"
220 (PTP_DTC_UINT16), "and set to 0x3000" (PTP_OFC_Undefined, it
221 is perfectly valid to have undefined object formats, since it
222 is a legal value defining this).
223
224* This RESPONSE has:
225 CMD 0x99805, we see in ptp.h that this is PTP_OC_MTP_GetObjPropList.
226 Return Code ("RC") = 0x2001, PTP_RC_OK, all went fine.
227 Transaction# 0x00000023.
Linus Walleijfcf88912006-06-05 13:23:33 +0000228
Linus Walleijd05fce62007-09-29 20:17:23 +0000229If you want to compare the Windows behaviour with a similar
Linus Walleij6dc01682007-11-15 21:23:46 +0000230operation using libmtp you can go into the src/libusb-glue.c
231file and uncomment the row that reads:
Linus Walleijd05fce62007-09-29 20:17:23 +0000232
233//#define ENABLE_USB_BULK_DEBUG
234
235(I.e. remove the two //.)
236
237This will make libmtp print out a hex dump of every bulk USB
238transaction. The bulk transactions contain all the PTP/MTP layer
239data, which is usually where the problems appear.
240
Linus Walleij6fd2f082006-03-28 07:19:22 +0000241
Linus Walleijbd7624c2007-05-28 10:48:54 +0000242Devices does not work - last resort:
243------------------------------------
244
245Some devices that are dual-mode are simply impossible to get
246to work under Linux because the usb-storage(.ko) kernel
247module hook them first, and refuse to release them, even
Linus Walleij94f23d52007-08-04 19:37:28 +0000248when we specify the DEVICE_FLAG_UNLOAD_DRIVER flag. (Maybe
249it DOES release it but the device will immediately be probed
250at the USB mass storage interface AGAIN because it
251enumerates.)
Linus Walleijbd7624c2007-05-28 10:48:54 +0000252
Linus Walleije20abaf2007-12-10 11:20:34 +0000253Linux: Try this, if you have a recent 2.6.x Linux kernel,
Linus Walleij584eb8d2007-09-05 19:51:27 +0000254run (as root) something like:
255
256> rmmod usb_storage ; mtp-detect
257
258You can run most any command or a client like gnomad2 or
259Amarok immediately after the rmmod command. This works
260sometimes. Another way:
Linus Walleijbd7624c2007-05-28 10:48:54 +0000261
Linus Walleij94f23d52007-08-04 19:37:28 +0000262* Edit /etc/modprobe.d/blacklist
Linus Walleijbd7624c2007-05-28 10:48:54 +0000263
264* Add the line "blacklist usb-storage"
265
266* Reboot.
267
268Now none of you USB disks, flash memory sticks etc will be
269working (you just disabled them all). However you *can* try
270your device, and it might have started working because there
271is no longer a USB mass storage driver that tries to hook onto
272the mass storage interface of your device.
273
Linus Walleij94f23d52007-08-04 19:37:28 +0000274If not even blacklisting works (check with
275"lsmod | grep usb-storage"), there is some problem with
276something else and you may need to remove or rename the file
277/lib/modules/<VERSION>/kernel/drivers/usb/storage/usb-storage.ko
278manually.
279
Linus Walleijbd7624c2007-05-28 10:48:54 +0000280If you find the PerfectSolution(TM) to this dilemma, so you
281can properly switch for individual devices whether to use it
282as USB mass storage or not, please tell us how you did it. We
283know we cannot use udev, because udev is called after-the-fact:
284the device is already configured for USB mass storage when
285udev is called.
286
Linus Walleije20abaf2007-12-10 11:20:34 +0000287On Mac OS there is another ugly hack:
288
2891. Open up a terminal window
2902. Type:
291sudo mv /System/Library/Extensions/IOUSBMassStorageClass.kext
292/System/Library/Extensions/IOUSBMassStorageClass.kext.disabled
293
294and when prompted enter your password.
295
2963. Restart.
297
298To reverse this change, just reverse the filenames:
299
300sudo mv /System/Library/Extensions/
301IOUSBMassStorageClass.kext.disabled /System/Library/Extensions/
302IOUSBMassStorageClass.kext
303
304and restart.
305
Linus Walleijbd7624c2007-05-28 10:48:54 +0000306
Linus Walleij15def332006-09-19 14:27:02 +0000307Calendar and contact support:
308-----------------------------
Linus Walleijd3bdf762006-02-20 22:21:56 +0000309
Linus Walleij3c16fe42006-04-30 07:53:41 +0000310The Creative Zen series can read VCALENDAR2 (.ics) files
Linus Walleij15def332006-09-19 14:27:02 +0000311and VCard (.vcf) files from programs like for example
312Evolution with the following limitations/conditions:
Linus Walleijd3bdf762006-02-20 22:21:56 +0000313
Linus Walleij3c16fe42006-04-30 07:53:41 +0000314- The file must be in DOS (CR/LF) format, use the unix2dos
315 program to convert if needed
Linus Walleij15def332006-09-19 14:27:02 +0000316
317- Repeat events in calendar files do not seem to be supported,
318 entries will only appear once.
319
320- Calendar (.ics) files should be stored in the folder "My Organizer"
321 when sent to the device (this directory should be autodetected
Linus Walleij80b2c722006-06-22 17:57:17 +0000322 for use with calendar files, otherwise use the option
Linus Walleij15def332006-09-19 14:27:02 +0000323 -f "My Organizer" to sendfile for this) Apparently this file can
324 also contain tasklists.
325
326- Contact (.vcf) files should be stored in the folder "My Contacts"
327 when sent to the device. (-f "My Contacts")
328
329- Some devices are picky about the name of the calendar and
330 contact files. For example the Zen Microphoto wants:
331
Linus Walleijb1318d12006-09-25 14:59:26 +0000332 Calendar: My Organizer/6651416.ics
333 Contacts: My Organizer/6651416.vcf
334
335
336Syncing in with Evolution and Creative Devices
337----------------------------------------------
338
339Evolution can easily export .ics an .vcf files, but you currently
340need some command-line hacking to get you stuff copied over in
341one direction host -> device. The examples/ directory contains a script
342created for the Creative Zen Microphoto by Nicolas Tetreault.
343
Linus Walleij6e8cef42006-12-03 20:45:04 +0000344
345It's Not Our Bug!
346-----------------
347
348Some MTP devices have strange pecularities. We try to work around
349these whenever we can, sometimes we cannot work around it or we
350cannot test your solution.
351
Linus Walleij67038b92008-04-16 15:01:40 +0000352* Generic MTP/PTP disconnect misbehaviour: we have noticed that
353 Windows Media Player apparently never close the session to an MTP
354 device. There is a daemon in Windows that "hooks" the device
355 by opening a PTP session to any MTP device, whenever it is
356 plugged in. This daemon proxies any subsequent transactions
357 to/from the device and will never close the session, thus
358 Windows simply does not close sessions at all.
359
360 This means that device manufacturers doesn't notice any problems
361 with devices that do not correctly handle closing PTP/MTP
362 sessions, since Windows never do it. The proper way of closing
363 a session in Windows is to unplug the device, simply put.
364
365 Since libmtp actually tries to close sessions, some devices
366 may fail since the close session functionality has never been
367 properly tested, and "it works with Windows" is sort of the
368 testing criteria at some companies.
369
370 You can get Windows-like behaviour on Linux by running a HAL-aware
371 libmtp GUI client like Rhythmbox or Gnomad2, which will "hook"
372 the device when you plug it in, and "release" it if you unplug
373 it.
374
375 If this bug in your device annoys you, contact your device
376 manufacturer and ask them to test their product with some libmtp
377 program.
378
Linus Walleijb715ba62008-02-12 23:41:49 +0000379* Generic USB misbehaviour: some devices behave badly under MTP
380 and USB mass storage alike, even down to the lowest layers
381 of USB. You can always discuss such issues at the linux-usb
382 mailing list if you're using Linux:
383 http://www.linux-usb.org/mailing.html
384
Linus Walleij76b185d2008-02-12 23:46:14 +0000385 If you have a problem specific to USB mass storage mode, there
386 is a list of strange behaving devices in the Linux kernel:
387 http://lxr.linux.no/linux/drivers/usb/storage/unusual_devs.h
Linus Walleijf7d8df12008-02-13 00:02:17 +0000388 You can discuss this too on the mentioned list, for understanding
389 the quirks, see:
390 http://www2.one-eyed-alien.net/~mdharm/linux-usb/target_offenses.txt
Linus Walleij76b185d2008-02-12 23:46:14 +0000391
Linus Walleijdeddc342008-08-16 23:52:06 +0000392* Kernel bug on Linux. Linux 2.6.16 is generally speaking required
393 to use any MTP device under USB 2.0. This is because the EHCI
394 driver previously did not support zero-length writes to endpoints.
395 It should work in most cases however, or if you connect it
396 to an UHCI/OHCI port instead (yielding lower speed). But
397 please just use a recent kernel.
398
Linus Walleij07bb5382008-07-31 20:21:09 +0000399* Zen models AVI file seeking problem: the Zens cannot parse the
400 files for the runlength metadata. Do not transfer file with e.g.
401 mtp-sendfile, use mtp-sendtr and set the length of the track to
402 the apropriate number of seconds and it will work. In graphical
403 clients, use a "track transfer" function to send these AVI files,
404 the Zens need the metadata associated with tracks to play back
405 movies properly. Movies are considered "tracks" in the MTP world.
406
Linus Walleij64e2e982008-08-01 21:51:13 +0000407* Some devices that disregard the metadata sent with the MTP
408 commands will parse the files for e.g. ID3 metadata. Some still
409 of these devices expect only ID3v2.3 metadata and will fail with
410 a modern ID3v2,4 tag writer, like many of those found in Linux
411 applications. Windows Media Player use ID3v2.3 only, so many
412 manufacturers only test this version.
413
Linus Walleij6e8cef42006-12-03 20:45:04 +0000414* The Zen Vision:M (possibly more Creative Zens) has a firmware bug
415 that makes it drop the last two characters off a playlist name.
416 It is fixed in later firmware.
417
Linus Walleijc41f2e82007-03-12 22:26:00 +0000418* For Creative Technology devices, there are hard limits on how
419 many files can be put onto the device. For a 30 GiB device (like
420 the Zen Xtra) the limit is 6000, for a 60 GiB device the limit
421 is 15000 files. For further Creative pecularities, see the
422 FAQ sections at www.nomadness.net.
423
Linus Walleijd24a7ab2007-03-07 21:48:43 +0000424* Sandisk sansa c150 and probably several other Sandisk devices
425 (and possibly devices from other manufacturers) have a dual
426 mode with MTP and USB mass storage. The device will initially
427 claim to be mass storage so udev will capture is and make the
Linus Walleijda558be2007-03-10 21:42:25 +0000428 use of MTP mode impossible. One way of avoiding it could be to
Linus Walleijd24a7ab2007-03-07 21:48:43 +0000429 be to blacklist the "usb-storage" module in
430 /etc/modprobe.c/blacklist with a row like this:
Linus Walleijda558be2007-03-10 21:42:25 +0000431 "blacklist usb-storage". Some have even removed the
432 "usb-storage.ko" (kernel module file) to avoid loading.
Linus Walleijd24a7ab2007-03-07 21:48:43 +0000433
Linus Walleijda558be2007-03-10 21:42:25 +0000434* The iriver devices (possibly all of them) cannot handle the
Linus Walleij6e8cef42006-12-03 20:45:04 +0000435 enhanced GetObjectPropList MTP command (0x9805) properly. So
436 they have been banned from using it.
437
Linus Walleijda558be2007-03-10 21:42:25 +0000438* iriver devices have problems with older versions of libmtp and
Linus Walleij82265222007-03-04 19:47:08 +0000439 with new devices libmtp does not know of as of yet, since it
440 has an oldstyle USB device controller that cannot handle zero
Linus Walleijda558be2007-03-10 21:42:25 +0000441 writes. (Register your device with us!) All their devices are
442 likely to need a special device flag in the src/libusb-glue.c
443 database.
Linus Walleij82265222007-03-04 19:47:08 +0000444
Linus Walleij6e8cef42006-12-03 20:45:04 +0000445* The Samsung Yepp T9 has several strange characteristics, some
446 that we've managed to work around. (For example it will return
447 multiple PTP packages in a single transaction.)
448
Linus Walleijf2711b32007-02-26 20:18:40 +0000449* The early firmware for Philips HDD players is known to be
450 problematic. Please upgrade to as new firmware as you can get.
451 (Yes this requires some kind of Windows Installation I think.)
452
Linus Walleijb5a4f922008-05-11 20:15:00 +0000453* Philips HDD 1630/16 or 1630/17 etc may lock themselves up,
454 turning inresponsive due to internal corruption. This typically
455 gives an error in opening the PTP session. Apparently you can
456 do a "repair" with the firmware utility (Windows only) which
457 will often fix this problem and make the device responsive
458 again.
459
Linus Walleij9340aac2007-10-01 10:02:05 +0000460* Some devices that implement GetObjectPropList (0x9805) will
461 not return the entire object list if you request a list for object
462 0xffffffffu. (But they should.) So they may need the special
463 DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL.
464
465* Some (smaller) subset of devices cannot even get all the
466 properties for a single object in one go, these need the
467 DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST. Currently only the
468 iriver devices seem to have this bug.
469
470* The Toshiba Gigabeat S (and probably its sibling the
471 Microsoft Zune and other Toshiba devices) will only display
472 album information tags for a song in case there is also
473 an abstract album (created with the album interface) with
474 the exact same name.
Linus Walleijd132d8e2007-04-03 23:24:54 +0000475
Linus Walleij265b9d62007-11-25 20:08:15 +0000476* The Zen Vision:M has an older firmware which is very corrupt,
477 it is incompatible with the Linux USB stack altogether. The
478 kernel dmesg will look something like this, and you have to
479 upgrade the firmware using Windows:
480 usb 4-5: new high speed USB device using ehci_hcd and address 5
481 usb 4-5: configuration #1 chosen from 1 choice
482 usb 4-5: can't set config #1, error -110
Linus Walleijd132d8e2007-04-03 23:24:54 +0000483
Linus Walleijb715ba62008-02-12 23:41:49 +0000484
Linus Walleijd132d8e2007-04-03 23:24:54 +0000485Lost symbols
486------------
487
488Shared libraries can be troublesome to users not experienced with
489them. The following is a condensed version of a generic question
490that has appeared on the libmtp mailing list from time to time.
491
492> PTP: Opening session
493> Queried Creative Zen Vision:M
494> gnomad2: relocation error: gnomad2: undefined symbol:
495> LIBMTP_Get_Storageinfo
496> (...)
497> Are these type of errors related to libmtp or something else?
498
499The problem is of a generic nature, and related to dynamic library
500loading. It is colloquially known as "dependency hell".
501(http://en.wikipedia.org/wiki/Dependency_hell)
502
503The gnomad2 application calls upon the dynamic linker in Linux to
504resolve the symbol "LIBMTP_Get_Storageinfo" or any other symbol
505(ELF symbol, or link point or whatever you want to call them, a
506symbol is a label on a memory address that the linker shall
507resolve from label to actual address.)
508For generic information on this subject see the INSTALL file and
509this Wikipedia page:
510
511http://en.wikipedia.org/wiki/Library_(computing)
512
513When Linux /lib/ld-linux.so.X is called to link the symbols compiled
514into gnomad2 (or any other executable using libmtp), it examines the
515ELF file for the libmtp.so.X file it finds first and cannot resolve
516the symbol "LIBMTP_Get_Storageinfo" (or whichever symbol you have a
517problem witj) from it, since it's probably not there. There are many
518possible causes of this symbol breakage:
519
5201) You installed precompiled libmtp and gnomad2 packages (RPMs, debs
521 whatever) that do not match up. Typical cause: your gnomad2 package was
522 built against a newer version of libmtp than what's installed on your
523 machine. Another typical cause: you installed a package you found on
524 the web, somewhere, the dependency resolution system did not protest
525 properly (as it should) or you forced it to install anyway, ignoring
526 some warnings.
527
5282) You compiled libmtp and/or gnomad2 from source, installing both or
529 either in /usr/local/lib and /usr/local/bin. This means at compile-time
530 gnomad2 finds the libmtp library in /usr/local/lib but at runtime, it
531 depends on the Linux system wide library loader (/lib/ld-linux.so.X) in
532 order to resolve the symbols. This loader will look into the file
533 /etc/ld.so.conf and/or the folder /etc/ld.so.conf.d in order to find
534 paths to libraries to be used for resolving the symbols. If you have
535 some older version of libmtp in e.g. /usr/lib (typically installed by a
536 package manager) it will take precedence over the new version you just
537 installed in /usr/local/lib and the newly compiled library in
538 /usr/local/lib will *not* be used, resulting in this error message.
539
5403) You really did install the very latest versions (as of writing libmtp
541 0.1.5 and gnomad2 2.8.11) from source and there really is no
542 pre-installed package of either on your machine. In that case I'm
543 totally lost, I have no idea what's causing this.
544
545Typical remedies:
546
5471) If you don't want to mess around with your system and risk these
548 situations, only use pre-packaged software that came with the
549 distribution or its official support channels. If it still breaks,
550 blame your distribution, they're not packaging correctly. Relying on
551 properly packaged software and not installing things yourself *is* the
552 Linux solution to the "dependency hell" problem.
553
5542) Read about dynamically linked library handling until the stuff I wrote
555 about in the previous list sounds like music to your ears, inspect
556 your /lib, /usr/lib, /usr/local/lib, /etc/ld.so.conf and the
557 /etc/ld.so.conf.d, remove all pre-packed versions using RPM, APT,
558 YaST or whatever your distribution uses, compile libmtp and gnomad2
559 (or whatever) from source only and you will be enlighted.
560
561I don't know if this helps you, it's the best answer we can give.